我正在现有的Ruby代码库中做一些工作,而且我对Ruby很新。我经常看到这个初始化习语:
def initialize(input)
@number = input[:number]
@color = input[:color]
end
我想我有两个问题。一个是这是否是一个常见的习语,如果是这样,它有什么好处?第二个是,这里到底发生了什么?输入是一个数组的暗示吗?哈希?我不清楚潜在的机制。
答案 0 :(得分:2)
是的,这很常见。通常,当您看到这样的代码时,表示input
是Hash。有时,有人可能会传入一个像哈希一样的对象,我们仍然可以期待这段代码能够正常工作。我们可以告诉input
绝对不是数组,因为数组需要将整数用作索引,但:number
和:color
是符号。
每当您看到以:number
之类的冒号开头的内容时,就是Ruby symbol。
每当您看到以@
@number
开头的内容时,这就是实例变量的名称。实例变量用于在对象内存储数据供以后使用。
假设我们有一个类Foo
定义如下:
class Foo
def initialize(input)
@number = input[:number]
@color = input[:color]
end
end
在这种情况下,我们可以创建一个这样的新对象:
Foo.new(number: 4, color: 'red')
上面的代码相当于:
input_hash = { :number => 4, :color => 'red' }
Foo.new(input_hash)
关于这种模式的一个好处是你可以确切地告诉每个输入变量的用途,因为它将被写在描述性符号的旁边,而且输入变量的顺序也无关紧要。
如果要改进此代码,可以考虑使用名为keyword arguments的Ruby新功能。或者,您也可以考虑使用Hash#fetch,以便您可以更好地控制其中一个键丢失时发生的情况,而不是仅仅在对象中存储nil值。我还建议您检查任何意外密钥的输入哈希,如果找到则引发异常。
答案 1 :(得分:1)
这是一个常见的习语,如果是这样,它有什么好处?
这并不常见,但这是可以接受的。当传入的参数超过n个时,“n”通常是> 3,我们应该使用哈希。
有什么好处?看看代码。它简单易读吗?将:number
的输入参数分配给同名的实例变量是否有意义?
这里到底发生了什么?输入是一个数组的暗示吗?哈希?我不清楚潜在的机制。
这是一个哈希,其中:number
和:color
是键。