【发布时间】:2013-05-12 22:48:06
【问题描述】:
我应该如何考虑在任何方法定义之外的class << self 块中声明的@variable?看看这个脚本的最后一部分:
class VarDemo
@@class_var_1 = "This is @@class_var_1"
@class_i_var = "This is a @class_i_var"
attr_accessor :ivar_1
attr_accessor :ivar_2
def initialize(ivar_1: "base_ivar_1", ivar_2: "base_ivar_2")
@@class_var_2 = "This is @@class_var_2, defined within an instance method"
@ivar_1 = ivar_1
@ivar_2 = ivar_2
VarDemo.class_i_var_2 = "class_i_var_2 defined through accessor on the class object"
end
def print_vars
puts "from within an instance method. here 'self' is: #{self}"
# test instance variables
puts "@ivar_1: #{@ivar_1}"
puts "@ivar_2: #{@ivar_2}"
puts "self.ivar_1: #{self.ivar_1}"
puts "self.ivar_2: #{self.ivar_2}"
puts "ivar_1: #{ivar_1}"
puts "ivar_2: #{ivar_2}"
# test class variables
puts "@@class_var_1: #{@@class_var_1}"
puts "@@class_var_2: #{@@class_var_2}"
# test class instance variables (ivars on the class object)
puts "VarDemo.class_i_var: #{VarDemo.class_i_var}"
puts "VarDemo.class_i_var_2: #{VarDemo.class_i_var_2}"
puts "@class_i_var: #{@class_i_var} (should be empty, as it doesn't exist in the instance"
puts "self.class_i_var: #{self.class_i_var}"
rescue Exception => ex
puts "self.class_i_var is not defined in this scope (self is an instance)"
end
# open the class object
class << self
attr_accessor :class_i_var
attr_accessor :class_i_var_2
@what_about_this = "what would this be?"
attr_accessor :what_about_this
def print_what_about_this
puts "@what_about_this: #{@what_about_this}" # is empty
puts "VarDemo.what_about_this: #{VarDemo.what_about_this}" # is empty
end
end
end
@what_about_this 是什么?它在哪里定义?它只是解释器让我做的事情,但没有任何实际用途吗?我以为它是在Class 上定义的,但事实并非如此。
【问题讨论】:
-
你好安德鲁。感谢您的链接!我已经知道从根
Exception进行救援由于某些原因(阻止 unix 信号)是不好的,并且在“实际使用”代码中,我通常对错误采取更细粒度的控制......但你链接的答案非常确实有用。我不知道eval问题...很高兴知道。 -
在非“实际使用”代码中执行此操作只会使其更有可能在“实际”代码中意外执行此操作,或者稍后忘记更改。