Порядок исполнения для нескольких проков в Ruby
Я пробовал глупый пример, чтобы получить представление о нескольких процессах, отправленных методу. Однако, одна вещь, которая поразила меня, это порядок исполнения. Я посмотрел документацию по Proc, но не нашел объяснения (может быть, я не выглядел достаточно внимательно).
Вот пример:
def my_block(a, b)
a.call b.call
end
a = Proc.new { puts "hello" }
b = Proc.new { puts " world" }
my_block a, b
Выход:
world
hello
Кажется, что выполнение процедуры, когда задано более одного в строке, выполняется слева направо. Может кто-нибудь объяснить это поведение подробно?
2 ответа
Это потому что это:
a.call b.call
действительно:
a.call(b.call())
Итак b.call()
сначала расширяется (и запускается), как в любом старом языке программирования, и результат этого передается в качестве параметра a
,
Можно было бы надеяться, что это приведет к ошибке, но в Ruby дополнительный параметр для блока не приводит к ошибкам (хотя для метода это ошибка)...
Вы можете использовать точку с запятой, чтобы явно указать ruby начать новое выражение:
a.call; b.call
... но я бы сказал, что это довольно unidiomatic и "не-Ruby"...
Это просто потому, что они оба находятся в одной строке, поэтому b.call вызывается как параметр для a.call. Чтобы это работало так, как вы ожидаете;
def my_block(a, b)
a.call
b.call
end