我很难理解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
答案 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