Вызов пользовательского метода с &: синтаксис ом Ruby - PullRequest
0 голосов
/ 05 октября 2018

Итак, в основном я смотрел на этот простой пример:

%w[A B C].map(&:downcase)

И заинтересовался синтаксисом &:.После прочтения некоторых статей я думаю, что понял (или, по крайней мере, так думаю), поэтому я решил реализовать нечто подобное для Integer, например:

class Integer
  def my_multiplier
    puts "66"
  end
end

И здесь я могу получить преимуществосинтаксис &: причина, по которой мне разрешено это делать:

3.times(&:my_multiplier)

Но, конечно, результат в три раза больше 66.

Мои вопросыкак реорганизовать мой метод, чтобы я мог использовать значения из 3.times..?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Прежде всего, синтаксис &object, а не &:.&object вызывает .to_proc объекта.

Теперь, если вы хотите, чтобы ваш множитель просто помещал ваше целое число, умноженное на 66, вы бы записали его как:

class Integer
  def my_multiplier
    puts 66 * self
  end
end

Что приведет к

2.5.1 :006 > 3.times(&:my_multiplier)
0
66
132

Это эквивалентно вызову

3.times { |i| i.my_multiplier }

Вы также можете определить свой my_multiplier как процесс или лямбду,

2.5.1 :001 > p = ->(i) { puts i * 66 }
 => #<Proc:0x00005582b3ae5638@(irb):1 (lambda)> 
2.5.1 :002 > 3.times(&p)
0
66
132
0 голосов
/ 05 октября 2018

Неясно, для чего вы стреляли этим методом, но текущее целое число будет доступно как self.Таким образом, вы можете сделать что-то вроде этого:

class Integer
  def double 
    self * 2
  end 

end

3.times.map(&:double) # => [0, 2, 4]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...