在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
为什么我没有声明该方法是私有的?
答案 0 :(得分:94)
您给出的示例工作得非常好
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中尝试过 你原来的剧本中有拼写错误吗?
一切顺利
答案 1 :(得分:16)
还有一种语法可以添加更多静态方法
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
答案 2 :(得分:5)
这是我将您的代码复制/粘贴到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会话中尝试过它,它的工作方式相同。
你是否使用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
)并验证其公开性有问题的方法。
答案 3 :(得分:0)
我正在使用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"
它也在我的测试脚本中工作。你的代码没什么问题。没关系。