Ruby:如何制作一个公共的静态方法?

在Java中,我可能会这样做:

public static void doSomething(); 

然后,我可以静态访问该方法,而无需创build实例:

 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 

为什么如果我没有宣布该方法是私人的?

你举的例子工作得很好

 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版本中试过。你有原始脚本的拼写错误吗?

祝一切顺利

还有一个语法是有好处的,你可以添加更多的静态方法

 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 

这里是我的代码复制/粘贴到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" 

似乎工作。 在你的irbtesting一下,看看你得到了什么结果。 我在这个例子中使用了1.8.7,但是我也在Ruby 1.9.3中尝试了它,它的工作原理是一样的。

你是否使用MRI作为你的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 )并validation有关方法的公开性。

我正在使用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" 

它也在我的testing脚本中工作。 你的代码没有错,没关系。