0

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

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

是不是因为它打开了 Array 类并给它添加了函数?这些方法是类方法吗?我认为 of 的语法var1, var2 = var3, var4只是为了简洁的多个变量赋值。我从来没有见过用一方面的方法来完成它。有人可以解释吗?

4

2 回答 2

4
first, last, middle = shift, pop, scramble

这基本上等同于

first = shift
last = pop
middle = scramble

接收者(对于shift和方法)是隐式的,它pop是。这是一个实例,因为是一个实例方法。scrambleselfArraymunge_word

我从来没有见过用一方面的方法来完成它。

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

x = 1

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

a # => 2
b # => 5
于 2012-12-10T21:13:32.620 回答
2

self 作为实例方法的接收者始终是可选的。换句话说,一个裸实例方法调用总是被认为是针对自身的。

因此,由于括号也是可选的,shift因此是一个方法调用,并被认为是self.shift. 因为self是一个数组(因为这些是在打开 Array 类的地方定义的实例方法),所以我们告诉某个数组要移位。等等。

于 2012-12-11T01:51:25.737 回答