我写了下面的代码:
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
部分。我希望有人能指出我对方法链的一个很好的解释。
答案 0 :(得分:1)
show_pet
是Pet
的实例方法(就像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
方法调用返回的实例并打印其值。