#ruby
#ruby
Вопрос:
array = [1, 2, 3]
double = Proc.new { |num| num * 2 }
def custom_each(array)
count = 0
result =[]
while count < array.length
result << yield(array[count]) {amp;double}
count = 1
end
result
end
p custom_each(array)
**the error:**
/home/ec2-user/environment/ruby/Practise/01_tutorial.rb:9: syntax error, unexpected '{', expecting end
…результат << выход(массив [количество]) {amp;double}
Process exited with code: 1
у кого-нибудь есть какие-либо идеи относительно того, как это решить, я неправильно понимаю синтаксис. Я новичок.
Ответ №1:
Note: Defining a proc won’t run the code inside it, just like defining a
method won’t run the method, you need to use the call method for that.
Если вы ожидаете result
возврата [2, 4, 6]
, вам нужно выполнить следующее
array = [1, 2, 3]
def custom_each(array)
double = Proc.new { |num| num * 2 }
count = 0
result =[]
while count < array.length
result << double.call(array[count])
count = 1
end
result
end
custom_each(array) # [2, 4, 6]
Но чтобы выполнить приведенный выше код более простым способом, вам следует узнать больше о ruby iterators
, ruby blocks
, ruby proc
amp; array class
Ответ №2:
Прежде всего, ваши custom_each
работы намного больше похожи map
, поэтому, возможно, было бы лучше назвать его соответствующим образом:
def custom_map(array)
count = 0
result =[]
while count < array.length
result << yield(array[count])
count = 1
end
result
end
custom_map([1, 2, 3]) { |num| num * 2 }
#=> [2, 4, 6]
Теперь, чтобы преобразовать процесс в блок, вы добавляете его amp;
при вызове метода:
double = Proc.new { |num| num * 2 }
custom_map([1, 2, 3], amp;double)
#=> [2, 4, 6]
Таким образом, вы избегаете жесткого кодирования процесса в вашем методе.