Ruby 我该如何称呼;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

当我调用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     # 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()
(一旦你将其作为实例方法)。而是返回一个字符串,让调用方在需要时打印。