如何实现在Ruby中选择哈希?(How to implement options hashes in

2019-08-16 23:07发布

我怎样才能实现选项哈希? 这是怎么回事有选择哈希中有一个类的结构? 说我有一个个人类。 我想实现一个方法,如my_age当呼吁将使用选项哈希告诉我,我的年龄。

Answer 1:

你可以这样做:

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


Answer 2:

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


Answer 3:

那红宝石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


Answer 4:

在Ruby 2.X你可以使用**操作:

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

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


文章来源: How to implement options hashes in Ruby?