как я могу назвать "метод self.something" в рубине - PullRequest
0 голосов
/ 20 октября 2011

, когда я вызываю метод MyClock.tick, он дает мне «неопределенный метод», отметьте «Ошибка»

, как я могу вызвать метод, у которого в качестве имени метода указано «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

Ответы [ 4 ]

2 голосов
/ 20 октября 2011

Сначала назовите вашу переменную экземпляра всеми строчными буквами:

my_clock = Clock.new "clock.dat"

Далее исправьте методы класса / экземпляра. Вы, вероятно, хотите метод экземпляра:

def tick

вместо метода класса

def self.tick
0 голосов
/ 27 ноября 2011

Для начала Ruby поведения говорит, что никогда не используйте константы для локальных переменных, как вы только что сделали. Заглавная буква в начале идентификатора делает его константой. Когда вы объявляете ваш метод tick, вы объявляете его как метод класса, что означает, что он будет вызываться с Clock.tick, а не my_clock.tick. Если вы хотите, чтобы метод использовался с my_clock.tick, удалите self. в имени метода.

0 голосов
/ 20 октября 2011

«Лучший» (или, точнее, наименее плохой) способ, который я нашел, состоит в том, чтобы извлечь класс объекта с помощью метода «class», а затем вызвать собственный метод. Например:

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

Обновление: можно, конечно, позвонить Clock.tick. Однако явное указание имени класса, когда нет необходимости, усложняет рефакторинг. Это также причина, почему методы класса часто определяются с использованием def self.tick, а не def Clock.tick.

0 голосов
/ 20 октября 2011

Вы пытаетесь вызвать метод класса из объектов. Используйте это:

Clock.tick

если вы хотите вызвать метод класса, или это

class Clock
  def tick
  end
end

Clock.new.tick

для вызова метода экземпляра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...