Ruby: Как сделать публичный статический метод?
В Java я могу сделать:
public static void doSomething();
И затем я могу получить доступ к методу статически, не создавая экземпляр:
className.doSomething();
Как я могу это сделать в Ruby? это мой класс и из моего понимания self.
делает метод статическим:
class Ask
def self.make_permalink(phrase)
phrase.strip.downcase.gsub! /\ +/, '-'
end
end
Но когда я пытаюсь позвонить:
Ask.make_permalink("make a slug out of this line")
Я получаю:
undefined method `make_permalink' for Ask:Class
Почему это, если я не объявил метод приватным?
Ответы
Ответ 1
Ваш пример работает очень хорошо
class Ask
def self.make_permalink(phrase)
phrase.strip.downcase.gsub! /\ +/, '-'
end
end
Ask.make_permalink("make a slug out of this line")
Я пробовал в 1.8.7, а также в 1.9.3
У вас есть опечатка в оригинале script?
Все лучшее
Ответ 2
Есть еще один синтаксис, который имеет преимущество, которое вы можете добавить более статические методы
class TestClass
# all methods in this block are static
class << self
def first_method
# body omitted
end
def second_method_etc
# body omitted
end
end
# more typing because of the self. but much clear that the method is static
def self.first_method
# body omitted
end
def self.second_method_etc
# body omitted
end
end
Ответ 3
Здесь моя копия/вставка вашего кода в IRB. Кажется, что это нормально.
$ irb
1.8.7 :001 > class Ask
1.8.7 :002?>
1.8.7 :003 > def self.make_permalink(phrase)
1.8.7 :004?> phrase.strip.downcase.gsub! /\ +/, '-'
1.8.7 :005?> end
1.8.7 :006?>
1.8.7 :007 > end
=> nil
1.8.7 :008 > Ask.make_permalink("make a slug out of this line")
=> "make-a-slug-out-of-this-line"
Кажется, нужно работать. Протестируйте его и в своем irb
, и посмотрите, какие результаты вы получаете. Я использую 1.8.7 в этом примере, но я также пробовал его в сеансе Ruby 1.9.3, и он работал идентично.
Используете ли вы МРТ как свою реализацию Ruby (не то, что я думаю, что это должно повлиять на этот случай)?
В irb
вызовите Ask.public_methods
и убедитесь, что имя метода находится в списке. Например:
1.8.7 :008 > Ask.public_methods
=> [:make_permalink, :allocate, :new, :superclass, :freeze, :===,
...etc, etc.]
Поскольку вы также отметили это как вопрос ruby-on-rails
, если вы хотите устранить проблему с реальной моделью в своем приложении, вы можете, конечно, использовать консоль rails: (bundle exec rails c
) и проверить публичность рассматриваемого метода.
Ответ 4
Я использую ruby 1.9.3, и программа работает гладко в моем irb.
1.9.3-p286 :001 > class Ask
1.9.3-p286 :002?> def self.make_permalink(phrase)
1.9.3-p286 :003?> phrase.strip.downcase.gsub! /\ +/, '-'
1.9.3-p286 :004?> end
1.9.3-p286 :005?> end
=> nil
1.9.3-p286 :006 > Ask.make_permalink("make a slug out of this line")
=> "make-a-slug-out-of-this-line"
Он также работает в моем тесте script. Ничего плохого в вашем коде. Это нормально.