Вопрос по block, ruby – Передача блока в метод - Ruby [duplicate]

2

На этот вопрос уже есть ответ:

лок @Code передается каждой работе в скобках, но не с помощью «do» - «end» (ruby) 3 ответа

У меня небольшой вопрос по прохождению блока.

def a_method(a, b)
  a + yield(a, b)
end

Это отлично работает.

k = a_method(1, 2) do |x, y| 
  (x + y) * 3 
end
puts k

Но это не сработает.

puts a_method(1, 2) do |x, y| 
  (x + y) * 3 
end
# LocalJumpError: no block given (yield)

Кто-нибудь может мне это объяснить?

Благодарность. Пример взят из Metaprogramming Ruby Паоло Перротта. Отличная книга.

Ваш Ответ

2   ответа
5

Разница междуdo .. end и фигурные скобки в том, что фигурные скобки связывают с крайними правыми выражение, аdo .. end свяжись с крайним левым один. Обратите внимание на следующие примеры:

def first(x=nil)
  puts "  first(#{x.inspect}): #{block_given? ? "GOT BLOCK" : "no block"}"
  "f"
end

def second(x=nil)
  puts "    second(#{x.inspect}): #{block_given? ? "GOT BLOCK" : "no block"}"
  "s"
end

first second do |x| :ok end #   second(nil): no block
                            # first("s"): GOT BLOCK

first second {|x| :ok }     #   second(nil): GOT BLOCK
                            # first("s"): no block

В первом случае блок сделан сdo..end будет связан с первой функцией (самой левой). Во втором случае блок из фигурных скобок будет связан со второй функцией (крайняя справа).

Обычно рекомендуется использовать круглые скобки, если у вас есть две функции и блок - только для удобства чтения и во избежание ошибок.

Очень легко случайно передать блокputs метод, как и в твоем вопросе.

Я вижу. Спасибо за объяснение revolver
-1

что блок переданputs а неa_method.
Это должно сделать это:

puts (a_method(1, 2) { |x, y| (x + y) * 3 })

# if you want to keep it multilines
puts (a_method(1, 2) { |x, y|
  (x + y) * 3
})
Привет, можешь привести пример с окончанием? Я попробовал с фигурными скобками до этого. Пытался выяснить, как использовать do..end. revolver
Я продолжал искать, но ничего не нашел об этой проблеме. Может бытьputs не должен просто иметь конец ... внутри (это имеет смысл, потому что он не должен отображать многострочный текст)? Вы можете продолжать использовать фигурные скобки даже для многострочного блока. Samy Dindane

Похожие вопросы