пытаюсь передать управление процессу изнутри метода для раздражения, но мой синтаксис неправильный в ruby

#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]
  

Таким образом, вы избегаете жесткого кодирования процесса в вашем методе.