簡體   English   中英

在ruby中使用class_eval時,如何訪問原始類中的常量?

[英]When using class_eval in ruby, how to access the constant in the original class?

我想使用class_eval擴展一個類,並且在嘗試從原始類訪問常量時,我​​得到一個錯誤說:

NameError:未初始化的常量HIS_CONSTANT來自./my_module.rb:35:來自(irb)的“show_his_constant”:4

我測試了一個示例程序,但無法使其正常工作。 有人可以檢查,看看為什么這不起作用? 謝謝!

module MyModule
  puts "start my module"
  def mytest
    puts "mytest"
  end

  module YourModule
    def yourtest
      puts "yourtest"
    end
  end
end

module MyModule
  module YourModule
    module HisModule
      HIS_CONSTANT = 'THIS_IS_A_CONSTANT'
    end
  end
end

module MyModule
  module YourModule
    class HisClass
      include HisModule
      def show_constant
        puts HIS_CONSTANT
      end
    end
  end
end

MyModule::YourModule::HisClass.class_eval do
  def show_his_constant
    puts HIS_CONSTANT
  end
end

順便說一句,我知道這種方式可行:

MyModule::YourModule::HisClass.class_eval do
  def show_his_constant
    puts MyModule::YourModule::HisModule::HIS_CONSTANT
  end
end

但我不想使用命名空間來訪問,因為它應該已經包含在內。

您必須使用ruby 1.8,因為您的代碼看起來像1.9中所寫的那樣工作。

在1.8中,問題似乎是常量被綁定在定義塊的上下文中(當你開始編寫MyModule::YourModule::HisClass.class_eval時,無論是什么樣的self )。 您可以通過使用Module.const_get延遲常量綁定,直到self成為MyModule::YourModule::HisClassModule.const_get

MyModule::YourModule::HisClass.class_eval do
  def show_his_constant
    puts self.class.const_get(:HIS_CONSTANT)
  end
end

irb 1.8.7> MyModule::YourModule::HisClass.new.show_his_constant
THIS_IS_A_CONSTANT

這個怎么樣

MyModule::YourModule::HisClass.class_eval do
  def show_his_constant
    puts self::class::HIS_CONSTANT
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM