Ruby Class setter -
i have difficulties understanding setter , how apply value in use.
in below example,
def time_string=(seconds) @time_string = calculator(seconds) end how can seconds' value setter?
thanks lot
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
i think you're trying accomplish. first, calculate code...why? why not use methods in time class? second, there not such thing setters in ruby. in ruby method. technically, call setter method acts setter. in code, both methods seconds= , seconds act setter (the first sets @seconds return value of calculator call, , second method sets @seconds 0).
you can't seconds value setter method, purpose of setter method is, after all, set something. if want something, use getter method. , it's pretty simple create getter method, change seconds method this:
def seconds @seconds # value of @seconds now, don't set 0 end ruby can create method automatically in background 1 line added inside class, , line attr_reader :seconds. each time see in ruby code, assume ruby in background generate similar seconds method above. in same fashion, if want ruby automatically generate setter method code this:
def seconds=(t) @seconds = t end then use attr_writer :seconds. these attr_reader , attr_writer methods exist because making setter , getter methods common shortens program significantly, if have, say, 10 instance variables (you have @seconds , @time_string , have instance variables minutes, hours, days, etc. lot of methods getting/setting instance variables!). in same fashion, create getter method automatically @time_string well:
def time_string @time_string end but not setter method because set logic @time_string kinda different method ruby create (attr_reader , attr_writer create simple getter/setter methods), if type attr_writer :time_string, ruby create method in background:
def time_string=(some_value) @time_string = some_value end which not want. can simplify code lot, here's version:
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 = timer.new a.seconds = 30 p a.seconds #=> 30 a.time_string = 50 p a.time_string #=> "00:00:50" you further simplify code using attr_accessor seconds, recommend this excellent answer explains more these shortcuts.
Comments
Post a Comment