Когда метод экземпляра вызывает метод класса, я должен использовать self.class_method? - PullRequest
0 голосов
/ 04 марта 2011

Я получаю сообщение об ошибке, поэтому мне кажется, что я должен ссылаться на метод класса внутри метода экземпляра с помощью self.class_method_name, но почему это так?

Разве это не должно разрешить это самостоятельно? Confused.

def self.blah(string)
  ..
end

def some_method()
  some_thing = blah("hello")
end

Ответы [ 2 ]

3 голосов
/ 04 марта 2011

Если у вас есть

# This won't work
class Foo
  def self.blah(string)
    puts "self.blah called with a string of #{string}"
  end

  def some_method
    # This won't work
    self.blah("hello")
  end
end

foo = Foo.new
foo.some_method

Это не сработает, потому что будет искать метод экземпляра Foo#blah.Вместо этого вы ищете Foo.bar.

Чтобы сделать some_method вызов Foo.bar, вы должны some_method обратиться к классу Foo, а затем вызвать blah для него.

class Foo
  def self.blah(string)
    puts "self.blah called with a string of #{string}"
  end

  def some_method
    # This will work
    self.class.blah("hello")
  end
end

foo = Foo.new
foo.some_method

Причина, по которой у вас есть def self.blah для определения метода, но self.class.blah для вызова метода, заключается в том, что в первом случае self относится к классу Foo, а впоследнее, self относится к объекту foo, поэтому вам нужно self.class для ссылки на класс Foo.

1 голос
/ 04 марта 2011

Может быть проще представить self как часть имени метода, поэтому ясно, что вы никогда не определяли метод blah, вы определяли только метод self.blah. (Чтобы уточнить: предыдущее предложение не следует слишком много думать, поэтому, пожалуйста, не читайте его, так как дело не в том, как все работает на самом деле, а просто своего рода попытка «непрофессиональных терминов») объяснить, почему ононе работает.)

Кроме того, что если вы определили метод экземпляра blah в дополнение к методу класса?Если для доступа к методу класса было достаточно вызова blah, как бы вы вызвали метод экземпляра?

Наконец, в Ruby нет такого понятия, как метод класса, «методы класса» действительнометоды синглтон-класса.

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