Порядок исполнения для нескольких проков в 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
Другие вопросы по тегам