Подтвердить что ты не робот

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

Почему это, если я не объявил метод приватным?

4b9b3361

Ответ 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. Ничего плохого в вашем коде. Это нормально.