有没有一种方法可以从Ruby中的实例调用私有Class方法?

时间:2020-03-05 18:41:40  来源:igfitidea点击:

当然除了self.class.send:method,args ...。我想在类和实例级别提供一个相当复杂的方法,而无需重复代码。

更新:

@乔纳森·布拉南(Jonathan Branam):这是我的假设,但我想确保没有其他人找到解决方法。 Ruby中的可见性与Java中的可见性非常不同。我们也很正确,private不适用于类方法,尽管这将声明一个私有类方法:

class Foo
  class <<self
    private
    def bar
      puts 'bar'
    end
  end
end

Foo.bar
# => NoMethodError: private method 'bar' called for Foo:Class

解决方案

回答

除非我有误会,否则我们是否仅需要以下内容:

class Foo
    private
    def Foo.bar
        # Complex logic goes here
        puts "hi"
    end

    public
    def bar
        Foo.bar
    end
end

当然,如果我们想避免对类名进行硬编码,则可以更改第二个定义以使用self.class.send方法。

回答

这是一个伴随问题的代码段。在类定义中使用"私有"不适用于类方法。我们需要使用" private_class_method",如以下示例所示。

class Foo
  def self.private_bar
    # Complex logic goes here
    puts "hi"
  end
  private_class_method :private_bar
  class <<self
    private
    def another_private_bar
      puts "bar"
    end
  end
  public
  def instance_bar
    self.class.private_bar
  end
  def instance_bar2
    self.class.another_private_bar
  end
end

f=Foo.new
f=instance_bar # NoMethodError: private method `private_bar' called for Foo:Class
f=instance_bar2 # NoMethodError: private method `another_private_bar' called for Foo:Class

我没有办法解决这个问题。该文档说我们不能指定私有方法的接收。同样,我们只能从同一实例访问私有方法。类Foo是与给定实例Foo不同的对象。

不要把我的答案作为最后的答案。我当然不是专家,但是我想提供一个代码段,以便其他尝试回答的人将拥有正确的私有类方法。