从模块ruby定义受保护的类方法



我试图通过只能由自己和继承它们的其他类调用的模块为类提供一个受保护的方法。我想隐藏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

您实际上是在元类(类的类)上调用该方法,并且该方法是在类本身上定义的。

最新更新