如何在Ruby中实现选项哈希?

时间:2013-02-14 02:33:03

标签: ruby hash options

如何实现选项哈希?具有选项哈希的类的结构如何?说我有一个人课。我想实现一个像my_age这样的方法,当被调用时会告诉我使用选项哈希的年龄。

4 个答案:

答案 0 :(得分:6)

你可以这样做:

class Person

  def initialize(opts = {})
    @options = opts
  end

  def my_age
    return @options[:age] if @options.has_key?(:age)
  end

end

现在你可以打电话给这样的年龄

p1 = Person.new(:age => 24)<br/>
p2 = Person.new

p1.my_age # => 24<br/>
p2.my_age # => nil

答案 1 :(得分:3)

class Person
  def birth_date
    Time.parse('1776-07-04')
  end

  def my_age(opts=nil)
    opts = {
      as_of_date: Time.now, 
      birth_date: birth_date,
      unit: :year
    }.merge(opts || {})
    (opts[:as_of_date] - opts[:birth_date]) / 1.send(opts[:unit])
  end
end

答案 2 :(得分:1)

值得一提的是,Ruby 2.1增加了传递不需要按特定顺序排列的关键字参数的功能,并且可以使它们成为必需或具有默认值。

抛弃选项哈希减少了样板代码以提取哈希选项。不必要的样板代码增加了拼写错误和错误的机会。

此外,在方法签名本身中定义了关键字参数,您可以立即发现参数的名称,而无需阅读方法的主体。

必需的参数后面跟一个冒号,而带有默认值的args会按照您的预期在签名中传递。

例如:

class Person
  attr_accessor(:first_name, :last_name, :date_of_birth)

  def initialize(first_name:, last_name:, date_of_birth: Time.now)   
    self.first_name = first_name
    self.last_name = last_name
    self.date_of_birth = date_of_birth
  end

  def my_age(as_of_date: Time.now, unit: :year)
    (as_of_date - date_of_birth) / 1.send(unit)
  end
end

答案 3 :(得分:0)

在Ruby 2.x中,您可以使用**运算符:

class Some
  def initialize(**options)
    @options = options
  end

  def it_is?
    return @options[:body] if @options.has_key?(:body)
  end
end