如何在变量中存储方法属性

时间:2014-03-04 09:46:04

标签: ruby-on-rails ruby

class Dates
  ATTRS = {date_from: '', date_to: ''}

  def set_dates(ATTRS)
    @date_from = date_from
    @date_to   = date_to
  end

  def show_dates(ATTRS)
    p date_from
    p date_to
  end
end

Dates.new.set_dates(date_from: Time.current, date_to: Time.current)
#-:4: formal argument cannot be a constant
#  def set_dates(ATTRS)
#                     ^
#-:9: formal argument cannot be a constant
#  def show_dates(ATTRS)

问题是:是否可以将方法属性存储在变量中?

2 个答案:

答案 0 :(得分:4)

您可以在Ruby 2.0中使用新的关键字参数语法:

class Dates
  def set_dates(date_from: '', date_to: '')
    @date_from = date_from
    @date_to = date_to
  end
  def show_dates
    p @date_from
    p @date_to
  end
end

或Ruby 2.0之前的哈希参数:

class Dates
  ATTRS = {date_from: '', date_to: ''}
  def set_dates(attr)
    attr = ATTRS.merge(attr)
    @date_from = attr[:date_from]
    @date_to = attr[:date_to]
  end
  def show_dates
    p @date_from
    p @date_to
  end
end

对于show_dates方法,我猜您的意思是显示Dates实例的状态,因此我对其进行了一些修改。

此外,在Ruby中,以大写字母开头的变量被视为常量,不能将其用作方法的形式参数。

答案 1 :(得分:2)

我会使用Ruby(2.0.0 > =)new keyword rest参数(**运算符编写如下代码:

class Dates
  def set_dates(**attr)
    @date_from,@date_to = attr.values_at(:date_from,:date_to)
  end

  def show_dates
    p @date_from
    p @date_to
  end
end