Почему в Ruby можно умножить строку на int с блоком как замыкание? - PullRequest
2 голосов
/ 19 августа 2011

При чтении книги Программирование на Ruby , один пример показывает, как блоки могут использоваться как замыкания:

def nTimes(aThing)
  return proc {|n| aThing * n}
end

p = nTimes("Hello ")

Теперь, если мы выведем значение p.call(3), это будет Hello Hello Hello

Однако, если бы наш код был просто puts 3 * "Hello ", Ruby пожаловался бы на несовместимый тип.

Почему? Спасибо.

1 Ответ

6 голосов
/ 19 августа 2011

Ваша проблема не имеет ничего общего с замыканиями или блоками. Это связано с тем, как обрабатываются операторы в Ruby.

В бинарных операциях, таких как * и +, , объект слева от операнда является получателем метода . Поэтому, когда вы делаете "hello " * 3, он вызывает метод * для класса String и передает 3 в качестве параметра. Определение String#* принимает целые числа в качестве параметров и возвращает self, повторенное столько раз, следовательно, вывод "hello hello hello ".

Но если вы сформулируете его как 3 * "hello ", вызывается метод * класса Fixnum, и "hello " передается в качестве параметра. Fixnum#* не знает, что делать с параметрами String, поэтому вы получаете сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...