如何访问同类其他对象的实例变量

时间:2015-06-23 01:46:33

标签: ruby

这是面试的问题。我应该在几秒和几毫秒内创建一个数据结构,然后创建两个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_sectime_2 time_1.difference(time_2)个变量时遇到问题。我认为语法是time_2.@sec.to_itime_2.#@sec.to_i,但这些返回错误。 time_2.sec会返回未初始化的时间,即使它看起来已经初始化了。我想知道这个问题的解决方案。

4 个答案:

答案 0 :(得分:4)

@sec@milli_secTime类的实例变量。这意味着除非您执行其他操作,否则只有实例本身可以访问它们。代码的其他部分可以创建实例,但只能访问您指定的方法。这样做是为了让您可以更改底层实现,而不会影响使用此类的代码的其他部分。

有多种方法可以做到这一点。您可以在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_readerattr_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"