为什么没有这种方法的接收器?

时间:2012-12-10 21:11:01

标签: ruby

您好我正在查看ruby测验解决方案(http://rubyquiz.com/quiz76.html),这对我来说很有意义,但我无法理解为什么没有{{1}或self中方法shift, pop, scramble的任何类型的接收器:

munge_word

是因为它打开了Array类并为其添加了函数吗?这些方法是类方法吗?我认为class Array def munge_each map { |word| word.split(//).munge_word } end def munge_word first, last, middle = shift, pop, scramble "#{first}#{middle}#{last}" end def scramble sort_by{rand} end end 的语法只是简单的多个变量赋值。我从来没有见过一方用方法。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:4)

first, last, middle = shift, pop, scramble

这基本上等同于

first = shift
last = pop
middle = scramble

接收方(适用于shiftpopscramble方法)是隐式的,它是self。哪个是Array的实例,因为munge_word是一个实例方法。

  

我从未见过用方法做过的事。

变量,方法 - 没关系。右手值只需要是表达式的列表(或数组)。任何表达。看:

x = 1

a, b = (x * 2), (x / 0 rescue 5)

a # => 2
b # => 5

答案 1 :(得分:2)

self始终是可选的实例方法的接收器。换句话说,裸实例方法调用总是被视为指向自我。

因此,由于括号也是可选的,shift是一个方法调用,它被认为是self.shift。由于self是一个数组(因为这些是已经打开Array类的实例方法),我们告诉一些数组要转移。等等。