Ruby on rails Ruby在运行时将变量转换为常量

Ruby on rails Ruby在运行时将变量转换为常量,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试创建一个模块,它将包含在许多不同的类中。它需要记录调用方到类文件的路径 因此,我可以在以后的代码中引用该路径。这段代码试图向调用类添加一个方法,但失败了,因为它只返回当前值@x # /home/eric/FindMe.rb class FindMe include GladeGUI end # /home/eric/GladeGUI.rb module GladeGUI def self.included(obj) @@x, = caller[0].partition

我正在尝试创建一个模块,它将包含在许多不同的类中。它需要记录调用方到类文件的路径 因此,我可以在以后的代码中引用该路径。这段代码试图向调用类添加一个方法,但失败了,因为它只返回当前值@x

# /home/eric/FindMe.rb
class FindMe
  include GladeGUI
end

# /home/eric/GladeGUI.rb
module GladeGUI

 def self.included(obj)
    @@x, = caller[0].partition(":") # this works @@x = "/home/eric/FindMe.rb"
    obj.class_eval do
      def my_class_file_path
        return ????? # I want to return "/home/eric/FindMe.rb"
      end
    end
  end

end
GladeGUI模块将“包含”在许多不同的类中,因此我不能只向调用类添加代码。我需要一种方法将@x编译成常量值,因此类中存储的方法如下所示:

      def my_class_file_path
        return "/home/eric/FindMe.rb"
      end
如何在代码中将变量转换为常量


谢谢。

看起来您实际上并不需要它是一个“常量”-您只需要某种方法使该方法始终返回正确的值,并且不允许其他代码出现并更改该值(使用当前的
@@x
解决方案,有人可以修改
@@x
,它将中断)

解决方案是将数据存储在局部变量而不是类或实例变量中,然后通过闭包访问该局部变量。
没有其他代码具有“查看”局部变量的范围,因此它不能更改

但问题是,当您在class_eval中使用def时,调用方的作用域不会被捕获,因此代码无法看到您的局部变量。您可以使用
define\u方法

这里有一个例子

# /home/eric/GladeGUI.rb
module GladeGUI

 def self.included(obj)
    caller_file_path = caller[0].split(":").first
    obj.class_eval do
      define_method :my_class_file_path do
        return caller_file_path
      end
    end
  end

end

# /home/eric/FindMe.rb
class FindMe
  include GladeGUI
end

puts FindMe.new.my_class_file_path # prints the correct path
但是-如果您希望
my\u class\u file\u path
成为类方法而不是实例方法,请使用
define\u singleton\u method

module GladeGUI
 def self.included(obj)
    caller_file_path = caller[0].split(":").first
    obj.class_eval do
      define_singleton_method :my_class_file_path do
        return caller_file_path
      end
    end
  end
end

...
puts FindMe.my_class_file_path

有趣的旁注:这就是如何在javascript中伪造“私有变量”: