Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用Ruby时,是否应该将方法调用放入initialize中?_Ruby_Class_Idioms - Fatal编程技术网

在使用Ruby时,是否应该将方法调用放入initialize中?

在使用Ruby时,是否应该将方法调用放入initialize中?,ruby,class,idioms,Ruby,Class,Idioms,我正在构建一个日历对象。重要的是,我有一个日期对象和日期作为字符串 class Calendar def initialize(on, off, date_string) @on = on.to_i @off = off.to_i @date_string = date_string end end 我有一个将日期转换为日期对象的方法。如何在初始化中处理它。我是否要输入一个伪值,然后稍后再调用它?我要从内部调用它吗。什么是更地道的Ruby?更面向对象的方法是尽

我正在构建一个日历对象。重要的是,我有一个日期对象和日期作为字符串

class Calendar

  def initialize(on, off, date_string)
    @on = on.to_i
    @off = off.to_i
    @date_string = date_string
  end
end

我有一个将日期转换为日期对象的方法。如何在初始化中处理它。我是否要输入一个伪值,然后稍后再调用它?我要从内部调用它吗。什么是更地道的Ruby?

更面向对象的方法是尽早转换,并将富对象(此处为日期)保存在新对象中。您可能需要将给定的
日期\u或\u字符串
转换为日期

实施可以是:

class Calendar
  def initialize(on, off, date_or_string)
    @on = on.to_i
    @off = off.to_i
    @date = convert_to_date(date_or_string)
  end

  def convert_to_date(date_or_string)
     ... # Implementation here
  end
end

我把它放在初始值设定项中,如下所示:

class Calendar

  DATE_FORMAT = "%d/%m/%Y"

  def initialize(on, off, date_string)
    @on = on.to_i
    @off = off.to_i
    @date = Date.strptime(date_string, DATE_FORMAT)
  end
end

您可能想尝试编写一个赋值方法:

def date=(date_string)
  @date = ...(date_string)
end
如果需要,可以以类似的方式转换其他访问器,然后声明读访问器(如果适用):

attr_reader :on, :off, :date
在构造函数中,您只需执行以下操作:

def initialize(on, off, date_string)
  self.on = on
  self.off = off
  self.date = date_string
end

我不确定在
initialize
方法中使用太多逻辑是否是一个好主意-这意味着在创建对象时灵活性会降低。例如,我会

class Calendar

  def self.new_using_strings(on_string, off_string, date_string)
    on = on_string.to_i # Or Integer(on_string)
    off = off_string.to_i # Or Integer(off_string)
    date = convert_to_date(date_string)
    new(on, off, date)
  end

  def self.convert_to_date(date_string)
    # Implementation goes here
  end

  def initialize(on, off, date)
    @on, @off, @date = on, off, date
  end
end
这样,如果我想使用日期而不是日期字符串创建一个
calendar
对象,那么我可以这样做


但是,我还没有看到其他人采用这种方法。

需要调用
convert\u to\u date()
在这里的构造函数中,而不是
to_date
调用一个单独的方法来进行日期转换,我喜欢的一件事是,它可以更容易地开发测试代码,以更独立的方式执行日期转换逻辑。您可能需要为此设置
attr_访问器
,这样您就可以读/写属性。@Caley,我也打算这么做。我对这有点陌生,所以我正在阅读他们,以确保我理解他们。当然!只是确保你没有修复这个问题,然后遇到一个未定义变量的问题,比如@Caley、(@on)和(@off)应该永远不会改变。那么这些应该是attr_reader吗?谢谢你指出这一点。是的,如果你尝试过像
c=Calendar.new(“1”、“2”、“1/4/2011”)
这样的东西,然后尝试用
c.on=“10”
打开或关闭,你会得到on=”的一个未定义的方法。你是否还会保留日期字符串,以便我以后打印到网页时可以使用它?@noahpark这是rails吗?如果你正在使用rails,你会在ActiveSupport中得到很多帮助,使这变得更容易。@Caley,不,这是Ruby+Sinatra。不过我可以一直使用ActiveSupport gem。@NoahClark Ok很酷,只是检查一下。如果您开始大量处理日期并需要一些帮助人员(或者自己编写!),我相信您仍然可以
要求ActiveSupport/time
。编辑:抱歉,没有注意到您已经说过activesupport gem:D@NoahClark我还可以保存初始字符串。但更可能的是,我会存储基本日期对象,并在准备演示时将其转换为适当的格式。这还有一个优点,即允许以更隔离的方式测试日期转换功能。