83

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

メソッドをプライベートとして宣言していないのはなぜですか?

4

4 に答える 4

121

あなたの与えられた例は非常にうまく機能しています

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で試しました。元のスクリプトにタイプミスがありますか?

ではごきげんよう

于 2012-12-07T16:51:35.030 に答える
27

静的メソッドを追加できるという利点がある構文がもう1つあります

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
于 2016-05-11T11:13:17.610 に答える
7

これが私のコードのコピー/貼り付けです。正常に動作しているようです。

$ 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の実装としてMRIを使用していますか(この場合、それが違いを生むとは思いません)?

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)そして問題のメソッドの公開性を確認します。

于 2012-12-07T16:47:24.993 に答える
0

私はruby1.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"

テストスクリプトでも機能しています。与えられたコードに問題はありません。問題ありません。

于 2012-12-07T21:23:16.873 に答える