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

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

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 中的内容。似乎工作正常。

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

于 2012-12-07T16:47:24.993 回答
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"

它也在我的测试脚本中工作。您给定的代码没有问题。没关系。

于 2012-12-07T21:23:16.873 回答