Ruby 我该如何称呼;self.something方法“;红宝石色
当我调用MyClock.tick方法时,它会给我一个“undefined method'tick'for#”错误 我如何调用以“self.something”作为方法名称的方法,或者这不是问题所在Ruby 我该如何称呼;self.something方法“;红宝石色,ruby,methods,Ruby,Methods,当我调用MyClock.tick方法时,它会给我一个“undefined method'tick'for#”错误 我如何调用以“self.something”作为方法名称的方法,或者这不是问题所在 class Clock attr_accessor :hours, :mins, :secs, :time def initialize file_name @time = IO.readlines("clock.dat") @hours = @time[0].to_i
class Clock
attr_accessor :hours, :mins, :secs, :time
def initialize file_name
@time = IO.readlines("clock.dat")
@hours = @time[0].to_i # change values in array to ints
@mins = @time[1].to_i
@secs = @time[2].to_i
end
def self.tick
@sec = @sec + 1 # add on sec to the clock
if @secs > 59
@mins = @mins + @secs/60 # change to min from sec
@secs = 0 + @secs%60
end
if @mins > 59
@hours = @hours + @hours/60 #change to hour from min
@mins = 0 + @mins%60
end
if @hours > 23 #make sure not more then 24 hours
@hours = 0 + @hours%24
end
end
def self.to_s
puts ("#{@hours}:#{@mins}:#{@secs}") # prints time
end
end
MyClock = Clock.new "clock.dat"
MyClock.tick
MyClock.to_s
您正在尝试从对象调用类方法。 使用以下命令:
Clock.tick
如果要调用类方法,或
class Clock
def tick
end
end
Clock.new.tick
要首先调用实例方法,请使用所有小写字母命名实例变量:
my_clock = Clock.new "clock.dat"
接下来,修复类/实例方法。您可能需要一个实例方法:
def tick
而不是类方法
def self.tick
我发现的“最佳”方法(或者说,最不坏的方法)是使用“class”方法检索对象的类,然后调用self方法。例如:
class Clock
def self.tick
puts "This is self.tick"
end
# Example of call from non-self function to a self-function.
def test
# Note: Call from a member function needs the "self.", otherwise
# "class" will be interpreted as the keyword "class".
self.class.tick
end
end
my_clock = Clock.new
my_clock.test
# Example of a call to a class-self-function from an object.
my_clock.class.tick
更新:人们当然可以调用
时钟。勾选。但是,在不需要时显式指定类名会使重构等工作变得更加困难。这也是为什么类方法通常使用def self.tick
而不是def Clock.tick
定义的原因。首先,Ruby conduct建议不要像刚才那样对局部变量使用常量。标识符开头的大写字母使其成为常量。
当您声明tick
方法时,您是在将其声明为类方法,这意味着将使用Clock.tick
而不是my_Clock.tick
调用它。如果您希望该方法与my_clock.tick
一起使用,请删除方法名称中的self.
。我认为OP希望创建一个时钟实例,并对其调用tick
。挑剔:实例变量的前缀是@
,与局部变量my_clock
相反,它包含对clock
实例的引用。应该注意的是,def self.to_s
也必须是def to_s
@MichaelKohl.。为什么我们需要一个实例变量来存储clock类的新实例的值my_clock=clock.new“clock.dat”
将类似于a=[]
或a=Array.new
,对吗?这不是“最好的方法”,也不是最坏的方法。Ruby就是这样工作的:一个定义为self的方法。有些东西是类方法,这意味着您可以在类本身上调用它,而不是在它的任何实例上调用它。注意,类方法也可以定义为Clock.tick
,而不是self.tick
,尽管这在子类化时可能会引起一些问题。另外,请注意,您在其上调用类方法的类对象对实例属性(变量@
)一无所知。您所说的一切都是正确的。然而,在实践中,当实现一个类时,一些方法将是实例方法和一些类方法,并且人们通常希望从实例方法调用一个类方法。就我个人而言,我不喜欢在调用中包含类名本身,因为它在执行重构时会带来问题。同样,在C++语言中,实例方法可以直接调用类(即static)方法,而我的答案中提供的命名方案与我想要实现的最接近(不采用Ruby技巧,如<代码>方法>缺失<代码>。)我并没有建议在调用中包含类名本身。我只谈到了def Clock.tick
,以澄清def self.tick
的含义。我同意你说的其余部分,除了这个时钟示例不太符合有用且有意义的类方法的概念。请使用大写字母作为句子开头和“I”。不要在中调用put()
(一旦你将其作为实例方法)。而是返回一个字符串,让调用方在需要时打印。