我试图通过只能由自己和继承它们的其他类调用的模块为类提供一个受保护的方法。我想隐藏Class.method使用的方法,并且只能对内部的Class类或继承Class的子类进行访问。我该怎么做?这就是我到目前为止所拥有的。
#! /usr/bin/env ruby
module ProtectedClassMethods
@class_instance_var = 1234567
def included(base); base.extend(ProtectedClassMethods); end
protected
def protected_class_method; puts "A PROTECTED CLASS METHOD => #{@class_instance_var}"; end
end
class Class1
def value; "Class1"; end
end
class Class2 < Class1
extend ProtectedClassMethods
class << self
protected_class_method #crashes here
end
def value; "Class2"; end
end
class Class3 < Class2
class << self
@class_instance_var = 24681012
protected_class_method
end
def value; "Class3"; end
end
puts "Initializing Class1"
class1 = Class1.new
puts "Done (Class1)"
puts "Initializing Class2"
class2 = Class2.new
puts "Done (Class2)"
puts "Initializing Class3"
class3 = Class3.new
puts "Done (Class3)"
puts class1.value
puts class2.value
puts class3.value
给出这个错误
./protected_class_test.rb:20:in `singletonclass': undefined local variable or method `protected_class_method' for #<Class:Class2> (NameError)
from ./protected_class_test.rb:18:in `<class:Class2>'
from ./protected_class_test.rb:16:in `<main>'
这里有一个正在工作的东西。
module ProtectedClassMethods
@class_instance_var = 1234567
def included(base); base.extend(ProtectedClassMethods); end
protected
def protected_class_method; puts "A PROTECTED CLASS METHOD => #{@class_instance_var}"; end
end
class Class1
def value; "Class1"; end
end
class Class2 < Class1
extend ProtectedClassMethods
protected_class_method #crashes here
def value; "Class2"; end
end
class Class3 < Class2
@class_instance_var = 24681012
protected_class_method
def value; "Class3"; end
end
puts "Initializing Class1"
class1 = Class1.new
puts "Done (Class1)"
进行
class << self
protected_class_method #crashes here
end
您实际上是在元类(类的类)上调用该方法,并且该方法是在类本身上定义的。