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

Ruby 如何访问同一类的其他对象的实例变量,ruby,Ruby,这是一个面试问题。我应该创建一个以秒和毫秒为单位的数据结构,然后创建两个time对象,然后编写一个函数来返回两个times之间的差值。这是我的代码: 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

这是一个面试问题。我应该创建一个以秒和毫秒为单位的数据结构,然后创建两个
time
对象,然后编写一个函数来返回两个
time
s之间的差值。这是我的代码:

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\u sec
作为
时间1传递的
时间2
变量时遇到问题。差异(时间2)
。我认为语法是
time\u 2.@sec.to\u I
time\u 2.@sec.to\u I
,但这些返回错误
time_2.sec
返回未初始化的时间,即使它看起来已经初始化。我想知道这个问题的解决方案。

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

有多种方法可以做到这一点。您可以在
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的方法是将这一行添加到类的顶部:

attr_reader :sec, :milli_sec
这样做与定义上述两种方法的效果相同。您可能还想查看
attr\u accessor


另外,
Time
对于您自己的代码来说是一个糟糕的类名选择,因为它已经由Ruby本身定义了

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

有多种方法可以做到这一点。您可以在
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的方法是将这一行添加到类的顶部:

attr_reader :sec, :milli_sec
这样做与定义上述两种方法的效果相同。您可能还想查看
attr\u accessor


另外,
Time
对于您自己的代码来说是一个糟糕的类名选择,因为它已经由Ruby本身定义了

在ruby中,每个接口都是一组方法。不能只使用
obj.@var
访问实例变量,因为它们不是方法,因此不是接口。如果要公开实例变量,请创建公共方法来访问它们
attr\u reader
attr\u accessor
是创建这些方法的简便方法。

在ruby中,每个接口都是一组方法。不能只使用
obj.@var
访问实例变量,因为它们不是方法,因此不是接口。如果要公开实例变量,请创建公共方法来访问它们
attr\u reader
attr\u accessor
是创建这些方法的简便方法。

以下是我的最终解决方案:

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)

以下是我的最终解决方案:

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)

你以秒击败了我:(我写了完全相同的东西。谢谢Phillip,我能够通过添加这两个方法使它工作…但无法使用:attr_reader:sec,:milli_sec…我想这行将超过初始化?我还需要做其他更改吗(比如删除@字符或使用:字符)??谢谢!@KameronWhite看。特别是第2行和第10行末尾。你以秒数击败了我:(我写了完全相同的东西。grrrrrrrrrrr谢谢Phillip,我可以通过添加两个方法使它工作…但无法使用:attr_reader:sec,:milli_sec…我想这行将超过初始化?是否需要进行其他更改(例如删除@字符或使用:字符)??谢谢!@KameronWhite,请参阅。特别是第2行和第10行末尾。为什么不在
初始化期间转换和存储
int
值?为什么不在
初始化期间转换和存储
int
值?