具有调用私有(private)方法的静态方法的 Ruby 类?

标签 ruby static encapsulation

我有一个包含许多静态方法的类。每个人都必须调用一个通用方法,但我尽量不公开后一种方法。将其设为私有(private)只允许从该类的自己的实例进行访问? Protected 似乎也不能解决这里的问题。

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

class Foo
  def self.bar
    do_calc()
  end
  def self.baz
    do_calc()
  end
  def self.do_calc
  end
end

最佳答案

首先,static并不是 Ruby 行话 的真正组成部分。

举个简单的例子:

class Bar
  def self.foo
  end
end

它定义了方法foo在显式对象上,self ,在该范围内返回包含类 Bar . 是的,它可以定义为一个类方法,但是static 在 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

这会给你你所需要的:

Foo.bar
calculating...

Foo.baz
calculating...

Foo.do_calc
NoMethodError: private method `do_calc' called for Foo:Class

关于具有调用私有(private)方法的静态方法的 Ruby 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29737435/

相关文章:

ruby-on-rails - Rails 中的 CSV gem 在哪里?

ruby-on-rails - 具有取决于数据库的条件范围的 Rails 模型

c++ - 对静态 constexpr 字符串的 undefined reference (除非它是一个指针)

javascript - 这个 getter-setter 闭包是否有充分的理由以这种方式在其内部对象中声明它的私有(private)属性?

postgresql - 我应该如何提取 Postgres 函数中的重复逻辑?

ruby - ||= 是什么意思?

Ruby/Rails HTML 页面解析

PHP Static v Singleton 类 - ConnectionFactory 解释

非 CMS 内容中的 Magento 小部件呈现

java - 仅在 oop 中将方法的范围限制到另一个类