gpt4 book ai didi

ruby - 通过方法链了解 self

转载 作者:太空宇宙 更新时间:2023-11-03 17:32:31 24 4
gpt4 key购买 nike

我正在尝试理解 Ruby 中的 self 。

在下面粘贴的代码中,如果我创建一个新的 Animal 实例

fox = Animal.new.name("Fox").color("red").natural_habitat("forest").specie("mammal")

然后调用

fox.to_s

如果我不在每个方法中返回 self,它不会做任何事情。

为什么我在每个方法中都需要 self?创建新 Animal 后变量是否已经保存?

class Animal
def name(name)
@name = name
self
end
def specie(specie)
@specie = specie
self
end
def color(color)
@color = color
self
end
def natural_habitat(natural_habitat)
@natural_habitat = natural_habitat
self
end
def to_s
"Name: #{@name}, Specie: #{@specie}, Color: #{@color}, Natural Habitat: #{@natural_habitat}"
end
end

最佳答案

这种模式在 Ruby 中很少使用,它在 Java 和 JavaScript 等语言中更为常见,而在 jQuery 中则尤为普遍。部分原因是您在这里描述的冗长,其次是因为 Ruby 以 attr_accessorattr_writer 的形式提供了一个方便的增变器生成器。

这些访问器/修改器双重用途方法的一个问题是歧义。您的实现不完整,您无法从中读取信息。你需要的是:

def color(*color)
case (color.length)
when 1
@color = color
self
when 0
@color
else
raise ArgumentError, "wrong number of arguments (%d for 0)" % color.length
end
end

实现一些可以通过两种方式使用的东西需要大量代码:

animal.color('red')
animal_color = animal.color

如果你想使用它们,你需要编写你自己的元编程方法来生成它们,尽管我一开始就强烈反对走这条路。使用 attr_accessor 方法和选项哈希。

这是等效的 Ruby 模式:

# Up-front assignment via Hash
animal = Animal.new(
name: 'Fox',
color: 'red',
natural_habitat: 'forest',
specie: 'mammal'
)

# Assignment after the fact
animal.color = 'white'

关于ruby - 通过方法链了解 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30239911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com