Ruby类设置器

时间:2014-11-12 23:50:01

标签: ruby class setter

我很难理解setter以及如何应用该值。

在下面的例子中,

  def time_string=(seconds)
    @time_string = calculator(seconds)
  end

如何从setter获取秒数值?

非常感谢

class Timer
  def seconds
    @seconds = 0
  end

  def time_string
    @time_string
  end

  def seconds=(t)
    @seconds = t
  end

  def time_string=(seconds)
    @time_string = calculator(seconds)
  end

  def calculator(x)
    array = []
    sec = (x % 60).to_s
    min = ((x / 60 ) % 60).to_s
    hour = (x / 3600).to_s
    temp = [hour, min, sec]
    temp.map {|i| i.length < 2 ? array.push("0#{i}") : array.push("#{i}") }
    array.join(":")
 end

end

2 个答案:

答案 0 :(得分:2)

我想我得到了你想要完成的事情。首先,所有计算代码......为什么?为什么不使用Time类中的方法?第二,在Ruby中没有setter 这样的东西。 Ruby中的所有内容都是方法。从技术上讲,你所谓的setter是一个方法,就像一个setter。在你的代码中,方法seconds=seconds都充当了一个setter(第一组{ {1}}返回@seconds调用的返回值,第二种方法将calculator设置为0)。

你不能从setter方法中获取秒值,毕竟setter方法的目的是设置一些东西。如果你想获得某些东西,请使用getter方法。创建一个getter方法非常简单,只需将@seconds方法更改为:

seconds

Ruby可以在后台自动创建此方法,只需在您的类中添加一行,该行为def seconds @seconds # we GET the value of @seconds now, we don't set it to 0 end 。每次在一些Ruby代码中看到这一点时,假设Ruby在后台执行的操作生成类似于上面attr_reader :seconds方法的内容。以同样的方式,如果你想让Ruby也自动生成这样的setter方法代码:

seconds

然后使用def seconds=(t) @seconds = t end 。存在这些attr_reader和attr_writer方法是因为制作setter和getter方法非常常见,这会大大缩短你的程序,特别是如果你有10个实例变量(你现在有attr_writer :seconds@seconds,但是你还可以有分钟,小时,天等的实例变量,这些变量可以是获取/设置实例变量的很多方法!)。同样,您也可以自动为@time_string创建一个getter方法:

@time_string

但不是setter方法,因为def time_string @time_string end 的设置逻辑与Ruby创建的方法(attr_reader和attr_writer创建简单的getter / setter方法)有所不同,如果键入@time_string,则Ruby将在后台创建此方法:

attr_writer :time_string

这不是你想要的。您可以大量简化代码,这是我的版本:

def time_string=(some_value)
  @time_string = some_value
end

您还可以使用class Timer attr_reader :seconds, :time_string attr_writer :seconds def time_string=(seconds) @time_string = calculator(seconds) end def calculator(x) Time.at(x).utc.strftime("%H:%M:%S") end end a = Timer.new a.seconds = 30 p a.seconds #=> 30 a.time_string = 50 p a.time_string #=> "00:00:50" 秒进一步简化此代码,因为我建议使用this excellent answer来解释有关这些快捷方式的更多信息。

答案 1 :(得分:1)

不确定为什么要从setter返回值。 setter用于将初始值应用于类变量。您可以使用访问器来检索实例变量的值。

如果您在理解setter和访问器时遇到问题,我建议您阅读以下链接: Trying to learn / understand Ruby setter and getter methods