Ruby - когда выполняется блок? - PullRequest
5 голосов
/ 15 февраля 2020

Я понял, как работает ruby block.

block_test.rb

def foo
  yield if block_given?
end

my_block = foo { puts "hello" }

если я бегу, ruby block_test.rb. Конечно, выведите «привет», как вы и ожидали.

hello

Но мой вопрос: когда я выполнил блок ruby? Я нигде не вызывал метод foo.

Я не писал - foo() и тому подобное.

# I defined `foo` method here as [If a block has been given, execute it.] but did not call.
def foo
  yield if block_given?
end

# I also defined block of `foo` as [print 'hello'] and store into `my_block` variable. 
# But I did not say execute `foo`. Did I?
my_block = foo { puts "hello" }

Поэтому я предполагаю, что .. Когда вы объявляете блок, это неявно означает, что он выполнит метод с тем же именем блока

Пожалуйста, поправьте меня, если я что-то упустил.

1 Ответ

6 голосов
/ 15 февраля 2020

Я не писал - foo() такие вещи.

В Ruby круглые скобки необязательны при вызове методов. Вы можете вызвать метод без скобок. Например, puts часто вызывается без круглых скобок, например:

puts "hello"

Вы вызываете свой метод здесь:

my_block = foo { puts "hello" }
#          ^^^

Итак, я предполагаю, что ... Когда вы объявляете блок, это неявно означает, что он будет выполнять метод с тем же именем блока

Неясно, что вы спрашиваете здесь. У блока нет имени, поэтому «метод с тем же именем блока» не имеет смысла. Блок - это специальный аргумент для вызова метода. Он не может появляться где-либо еще, кроме как в качестве последнего аргумента вызова метода. Он не может быть присвоен переменной, он не может быть возвращен из метода, ему не может быть присвоено имя. Это не объект или значение.

...