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
值?