Ruby on rails Ruby在运行时将变量转换为常量
我正在尝试创建一个模块,它将包含在许多不同的类中。它需要记录调用方到类文件的路径 因此,我可以在以后的代码中引用该路径。这段代码试图向调用类添加一个方法,但失败了,因为它只返回当前值@xRuby 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
# /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中伪造“私有变量”: