首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义私有类方法

定义私有类方法
EN

Stack Overflow用户
提问于 2015-07-26 13:20:07
回答 3查看 35关注 0票数 0

此代码适用于:

代码语言:javascript
复制
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私人化。所以我做了这个:

代码语言:javascript
复制
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>'

我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-26 13:48:50

你在你的例子中改变了两件事:

  • pluralize是否是private
  • 它在哪个类中定义?

private是一个红鲱鱼,无论pluralize是否为private,您都会得到相同的错误。(请注意,错误不是“私有方法调用”,而是“未定义方法”!)在第二种情况下,您在一个与第一个示例完全不同的类中定义pluralize。在您的第一个示例中,pluralize是在TestPluralize中定义的方法,而在第二个示例中,它是TestPluralize的单例类中的一个方法(第一个有时也称为“实例方法”,第二个称为“类方法”,尽管这并不是真正正确的,因为区别不是在方法中,而是在定义它们的类中)。

你可以做这三个中的一个:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2015-07-26 13:26:44

如果您只想使pluralize私有,您可以添加private :pluralize使该方法私有(另一种方法是拥有private,然后您希望成为私有的所有方法都会在类中落在后面,但是第一种方法允许这样做,只需更改一行)。

代码语言:javascript
复制
class TestPluralize
  def pluralize(value)
    value != 1 ? 's' : ''
  end

  def test_it(v)
    pluralize(v)
  end

  private :pluralize
end

有关私有方法的更多详细信息,请参见Programming/Syntax/Classes#Private

票数 1
EN

Stack Overflow用户

发布于 2015-07-26 23:31:20

您也可以在定义#pluralize之后定义#test_it。这样,#test_it就会保持公开,而#pluralize就会成为私有的。在类中定义方法的顺序并不重要,但#initialize是第一位的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31637420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档