Ruby类用静态方法调用私有方法?

yam*_*ori 26 ruby static encapsulation

我有一个包含许多静态方法的类.每个人都必须调用一个常用方法,但我试图不暴露后一种方法.将其设为私有只允许从类的自己的实例访问?受保护似乎不会解决这里的问题.

如何隐藏do_calc在静态上下文中被外部调用?(让它可以从前两个静态方法调用.)

class Foo
  def self.bar
    do_calc()
  end
  def self.baz
    do_calc()
  end
  def self.do_calc
  end
end
Run Code Online (Sandbox Code Playgroud)

tom*_*ave 44

首先,static它不是Ruby行话的一部分.

我们举一个简单的例子:

class Bar
  def self.foo
  end
end
Run Code Online (Sandbox Code Playgroud)

foo在显式对象上定义方法self,在该范围内返回包含的类Bar.是的,它可以定义为一个类方法,但静态在Ruby中没有意义.

然后private不起作用,因为在显式对象上定义方法(例如def self.foo)绕过访问限定符并使方法公开.

你可以做的是使用class << self语法打开包含类的元类,并将那里的方法定义为实例方法:

class Foo
  class << self

    def bar
      do_calc
    end

    def baz
      do_calc
    end

    private

    def do_calc
      puts "calculating..."
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这将为您提供所需:

Foo.bar
calculating...

Foo.baz
calculating...

Foo.do_calc
NoMethodError: private method `do_calc' called for Foo:Class
Run Code Online (Sandbox Code Playgroud)

  • *lingo*这个词也不是每个人词汇的一部分;) (2认同)

spi*_*ann 14

您可以使用以下方法定义私有类方法private_class_method:

class Foo
  def self.bar
    do_calc
  end

  def self.baz
    do_calc
  end

  def self.do_calc
    #...
  end
  private_class_method :do_calc
end
Run Code Online (Sandbox Code Playgroud)


mb2*_*b21 5

或者从 Ruby 2.1 开始:

class Foo
  def self.bar
    do_calc
  end

  private_class_method def self.do_calc
    #...
  end
end
Run Code Online (Sandbox Code Playgroud)