В настоящее время я использую следующий код в программе ruby для оценки аргументов переменной длины, которые передаются методу. Программа работает, однако мне интересно, есть ли короткий способ написать это. Мое первоначальное описание должно было быть более конкретным, пытаясь переписать метод Inject для класса Array (отсюда и остроумное название...)
Поэтому он должен иметь возможность принимать максимум два аргумента и минимум 0, если задан блок.
- массив.inject(:+)
- array.inject{ |выход, число| вывод + число }
- array.inject(аргумент, :+)
- array.inject(arg) { |выход, число| вывод + число }
Наиболее сложными для обработки являются первый и четвертый случаи, когда 1 аргумент может быть либо Fixnum, либо Symbol. Как уже упоминалось, код работает, просто ищем способы привести его в порядок.
class Array
def enjict(*args)
if args.length == 2 && args[0].is_a?(Fixnum) && args[1].is_a?(Symbol)
start, symbol = args
elsif args.length == 1
raise ArgumentError unless args.first.is_a?(Symbol) || args.first.is_a?(Fixnum)
symbol = args.first if args.first.is_a?(Symbol)
start = args.first if args.first.is_a?(Fixnum)
else
raise ArgumentError unless block_given?
end
copiedArray = dup
start = copiedArray.shift unless start
if block_given?
copiedArray.each { |num| start = yield(start, num) }
else
copiedArray.each { |num| start = start.send(symbol, num) }
end
start
end
end
start = copiedArray.shift
выполняется, еслиstart
ранее не было присвоено значение. Это ваше намерение? Вы получите ошибку аргумента, еслиblock_given => false
иsymbol
ранее не были присвоены значения. Пожалуйста, объясни.copiedArray = dup
предполагает, что этот код находится внутри класса. Есть ли что-то, что нам нужно знать об этом классе? В более общем случае было бы полезно понять, чего вы пытаетесь достичь. Я вижу способы почистить код, но нужна дополнительная информация. - person Cary Swoveland   schedule 16.02.2015