使用符号的Ruby初始化习语

时间:2014-09-09 22:20:57

标签: ruby

我正在现有的Ruby代码库中做一些工作,而且我对Ruby很新。我经常看到这个初始化习语:

def initialize(input)
    @number         = input[:number]
    @color          = input[:color]
  end

我想我有两个问题。一个是这是否是一个常见的习语,如果是这样,它有什么好处?第二个是,这里到底发生了什么?输入是一个数组的暗示吗?哈希?我不清楚潜在的机制。

2 个答案:

答案 0 :(得分:2)

是的,这很常见。通常,当您看到这样的代码时,表示inputHash。有时,有人可能会传入一个像哈希一样的对象,我们仍然可以期待这段代码能够正常工作。我们可以告诉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是键。