定义私有类方法

时间:2015-07-26 13:20:07

标签: ruby

此代码有效:

class TestPluralize
  def pluralize(value)
    value != 1 ? 's' : ''
  end

  def test_it(v)
    pluralize(v)
  end
end

t = TestPluralize.new
#=> #<TestPluralize:0xb7f55a70>
t.test_it(5)
#=> "s"

但我想让pluralize私密。所以我这样做了:

class TestPluralize
  class << self
    private
    def pluralize(value)
      value != 1 ? 's' : ''
    end
  end

  def test_it(v)
    self.pluralize(v)
  end
end

t = TestPluralize.new
#=> #<TestPluralize:0xb8831b80>
t.test_it(5)
NoMethodError: undefined method `pluralize' for #<TestPluralize:0xb8831b80>
    from (irb):10:in `test_it'
    from (irb):15
    from /usr/local/bin/irb:11:in `<main>'

我做错了什么?

3 个答案:

答案 0 :(得分:1)

如果您只想将pluralize设为私有,则可以添加private :pluralize以将该方法设为私有(另一种方法是private,然后将所有方法设为私有在课堂上落后,但第一种方式只允许改变一行,这样做。)

class TestPluralize
  def pluralize(value)
    value != 1 ? 's' : ''
  end

  def test_it(v)
    pluralize(v)
  end

  private :pluralize
end

有关私有方法的详细信息,请参阅https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Private

答案 1 :(得分:1)

您正在更改示例中的两个事项:

  • pluralizeprivate
  • 中定义的类

private在这里是一个红色鲱鱼,无论pluralize是否为private,您都会得到完全相同的错误。 (请注意,错误是不是&#34;私有方法称为&#34;而是&#34;未定义的方法&#34;!)在第二种情况下,您正在定义pluralize在与第一个例子完全不同的类中。在您的第一个示例中,pluralizeTestPluralize中定义的方法,而在第二个示例中,它是TestPluralize单例类中的方法(第一个也是称为&#34;实例方法&#34;以及第二个&#34;类方法&#34;,虽然这不是真的正确,因为差异不在方法中,而是在哪个类中定义它们在)。

你可以做以下三种中的一种:

class TestPluralize
  private def pluralize(value)
    value != 1 ? 's' : ''
  end

  def test_it(v)
    pluralize(v)
  end
end

class TestPluralize
  def pluralize(value)
    value != 1 ? 's' : ''
  end
  private :pluralize

  def test_it(v)
    pluralize(v)
  end
end

class TestPluralize
  private

  def pluralize(value)
    value != 1 ? 's' : ''
  end

  public # or just switch the two methods around

  def test_it(v)
    pluralize(v)
  end
end

答案 2 :(得分:0)

您还可以在定义#pluralize后定义#test_it 。这样,#test_it保持公开,#pluralize变为私有。除了#initialize之外,在类中定义方法的顺序并不重要。