Ruby方法链(初学者)

时间:2017-11-08 14:23:13

标签: ruby method-chaining

我写了下面的代码:

class Pet
  attr_accessor :breed, :name, :weight

  def initialize(breed, name, weight)
    @breed = breed
    @name = name
    @weight = weight
  end

  def show_pet
    p "Your pet is a #{@breed}, and their name is #{@name}. They weigh #{@weight} lbs."
  end

  def set_weight(weight)
    @weight += weight
    self
  end
end

pet1 = Pet.new("Chihuahua", "Jill", 5)
pet1.set_weight(5).show_pet

但我不完全理解它是如何工作的,主要是self部分。我希望有人能指出我对方法链的一个很好的解释。

3 个答案:

答案 0 :(得分:1)

show_petPet的实例方法(就像set_weight),因此只能在Pet的实例上调用它。如果您希望在set_weight之后调用此方法,set_weight需要返回调用它的Pet实例。

self是您在set_weight(weight)中设置的返回值,在实例方法中,这是对您调用的Pet实例的引用方法。因此,只要Pet的实例调用该方法,它就会返回实例本身。

为了更清楚地看到这一点,你可以通过做这样的事情来尝试一点:

class Pet 
  ...
  def return_instance
    self
  end
end

pet1 = Pet.new('Chihuaha', 'Jill', 5)
pet1 == pet1.return_instance # => true

答案 1 :(得分:1)

如果你是初学者,还有几件事需要考虑。

方法中的最后一个值调用是方法的返回值。在您的示例中:

def set_weight(weight)
    @weight += weight
    self
end

相当于:

def set_weight(weight)
    @weight += weight
    return self # <- with return
end

然后,关于自我,如果您习惯使用其他语言,您可能已经看过关键字 this ,它是等效的。 它是您当前正在使用的类实例的指示对象。

当您返回自我时,您可以将调用链接起来:

rex_the_dog = Pet.new nil, 'rex', 20 #create rex_the_dog an instance of Pet
rex_the_dog.set_weight(3).set_weight(2) #As you return self, you can chain call like this
rex_the_dog.weight #return 25  (20 : set on init + 2 : first set_weight call + 3 : second set_weight call)

答案 2 :(得分:0)

在您的示例中,@weight是一个实例变量,set_weight是一个实例方法,它为实例变量@weight增加了权重。
self返回具有更新的@weight的类的实例。

然后show_pet方法调用返回的实例并打印其值。