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


69

在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
您确定它不在private标题下吗?它可能比您放置新方法的位置高得多,因此请仔细检查。
MrDanA

1
@MrDanA,它不是私人的。对此表示肯定
汤姆(Tom)

10
然后您的代码无法正确加载,因为该方法看起来不错。
安倍·沃克

我无法发布答案,因为该问题已关闭,但是您必须从要从中调用的文件中要求该类。因此,在另一个类中,您需要调用静态方法,包括以下行:require 'Ask',并在必要时添加Ask.rb文件的路径。
2014年

4
@Chloe阅读OP的错误消息。undefined method表示该类是已知的,但该方法不是。如果该类未知,则解释器将产生uninitialized constant Ask
wyattisimo 2014年

Answers:


106

您给出的示例运行良好

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中都尝试过,您的原始脚本中是否有错字?

祝一切顺利


您怎么知道定义和调用在同一个文件中?
2014年

3
@Chloe是一个如何调用的示例。您是出于这个原因否决了吗?
devanand 2014年

3
@Chloe在irb中复制示例并发送输出
devanand

24

还有一种语法,它的好处是您可以添加更多静态方法

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

感谢您的帮助,如果您不想让自己凌乱,那就太好了。在每种方法上。
杰夫·沃德,

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)并验证相关方法的公开性。


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"

它也可以在我的测试脚本中使用。给定的代码没有错,很好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.