定义仅在某个模块/类中可见的方法

时间:2014-04-22 08:53:55

标签: ruby methods visibility

有没有办法在模块/类foo上定义方法A,以便它只能从模块/类B或其后代中看到?以下说明了这种情况:

A.new.foo # => undefined

class B
  A.new.foo # => defined
  def bar
    A.new.foo # => defined
  end
  def self.baz
    A.new.foo # => defined
  end
end

class C < B
  A.new.foo # => defined
  def bar
    A.new.foo # => defined
  end
  def self.baz
    A.new.foo # => defined
  end
end

我直觉地认为精致是精神上的接近,但它似乎没有做我想要的。

1 个答案:

答案 0 :(得分:-1)

这很有效。 ^ _ ^

class A
    private
    def foo
        "THE FOO !!!"
    end
end

class B < A
    public :foo

    def initialize
        @foo = self.foo
    end
end

puts "A.new.foo #{ A.new.foo rescue '... sorry, no.' }"
=> A.new.foo ... sorry, no.

puts "B.new.foo #{ B.new.foo rescue '... sorry, no.' }"
=> B.new.foo THE FOO !!!

如果你想通过仍然使用A类名在所有子类中使用A.new.foo,那么你应该使用以下内容。

class A
    private
    def foo
        "THE FOO !!!"
    end
end

class B
    class A < A
        public :foo
    end

    attr_reader :c, :d

    def c
        A.new.foo
    end

    def d
        A.new.foo
    end
end

puts "A.new.foo #{ A.new.foo rescue '... sorry, no.' }"
=> A.new.foo ... sorry, no.

puts B.new.c
=> THE FOO !!!

puts B.new.d
=> THE FOO !!!