这是面试的问题。我应该在几秒和几毫秒内创建一个数据结构,然后创建两个Time
对象,然后编写一个可以返回两个Time
之间差异的函数。这是我的代码:
class Time
def initialize (sec, milli_sec)
@sec = sec
@milli_sec = milli_sec
end
def difference(time_2)
puts @sec.to_i*1000 + @milli_sec.to_i + time_2.@sec
end
end
time_1 = Time.new('5','30')
time_2 = Time.new('6','40')
time_1.difference(time_2)
这是错误:
syntax error, unexpected tIVAR, expecting '('
我在访问以@sec
传递的@milli_sec
个time_2
time_1.difference(time_2)
个变量时遇到问题。我认为语法是time_2.@sec.to_i
或time_2.#@sec.to_i
,但这些返回错误。 time_2.sec
会返回未初始化的时间,即使它看起来已经初始化了。我想知道这个问题的解决方案。
答案 0 :(得分:4)
@sec
和@milli_sec
是Time
类的实例变量。这意味着除非您执行其他操作,否则只有实例本身可以访问它们。代码的其他部分可以创建实例,但只能访问您指定的方法。这样做是为了让您可以更改底层实现,而不会影响使用此类的代码的其他部分。
有多种方法可以做到这一点。您可以在Time
类中定义以下两种方法:
def sec
@sec
end
def milli_sec
@milli_sec
end
这些方法是公开的(默认情况下),因此您现在可以执行此操作:
t = Time.new(1, 2)
puts t.sec # prints 1
puts t.milli_sec # prints 2
更多Ruby-ish方法是将此行添加到类的顶部:
attr_reader :sec, :milli_sec
这样做可以完成与定义上述两种方法相同的功能。您可能还想查看attr_accessor
。
P.S。 Time
对于您自己的代码来说是一个糟糕的类名选择,因为它本身已经由Ruby本身定义。
答案 1 :(得分:1)
在ruby中,每个界面都是一组方法。您不能只obj.@var
访问实例变量,因为它们不是方法,因此不是接口。如果要公开实例变量,则创建公共方法以访问它们。 attr_reader
和attr_accessor
只是创建这些方法的简便方法。
答案 2 :(得分:0)
这是我的最终解决方案:
class Moment
def initialize (sec, milli_sec)
@sec = sec
@milli_sec = milli_sec
end
def sec
@sec
end
def milli_sec
@milli_sec
end
def difference(time_2)
return ((@sec.to_i*1000 + @milli_sec.to_i) - (time_2.sec.to_i*1000 + time_2.milli_sec.to_i)).abs
end
end
time_1 = Moment.new('1','300')
time_2 = Moment.new('11','20')
time_1.difference(time_2)
答案 3 :(得分:0)
The same objective can be achieved in much lesser lines of code using approach as below:-
class MyTime
attr_accessor :seconds, :milli_seconds
def initialize(entity={})
@seconds = entity['seconds']
@milli_seconds = entity['milli_seconds']
end
def difference(obj)
ms= ((@seconds.to_i*1000+@milli_seconds.to_i)-(obj.seconds.to_i*1000+obj.milli_seconds.to_i))
secs = ms/1000
msecs = ms%1000
return MyTime.new({'seconds'=> secs,
'milli_seconds'=> msecs})
end
end
time_1 = MyTime.new({'seconds'=> '20',
'milli_seconds'=> '100'})
time_2 = MyTime.new({'seconds'=> '10',`enter code here`
'milli_seconds'=> '20'})
diff_Obj = time_1.difference(time_2)
puts "Difference is : #{diff_Obj.seconds} Seconds #{diff_Obj.milli_seconds} milliseconds"