2013-05-12 7 views
-3

class << self 블록 내에서 선언 된 은 어떻게해야합니까? 이 스크립트의 마지막 부분에서 봐 :`class << self` 내에서 선언 된 변수

@what_about_this 무엇
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 

? 정의 된 위치는 어디입니까? 통역사가 할 수있게 해주는 것이지, 실용적인 용도는 없습니까? 내가 그것이 Class에 정의 된 줄 알았지 만 그럴 것 같지 않습니다.

+0

[예외적으로 구출하지 마십시오.] (http://stackoverflow.com/q/10048173/211563) –

+0

안녕하세요. Andrew. 링크 주셔서 감사합니다! 나는 루트에서 구출하는 것이'유닉스 신호를 차단하는 것 '에 대한 몇 가지 이유 때문에 나쁘다는 것을 이미 알고 있었고, "실제 사용"코드에서 나는 보통 에러에 대한보다 세밀한 제어를 채택했다. 그러나 당신이 링크 한 대답은 매우 참으로 유용합니다. 나는 'eval' 문제에 대해 잘 알지 못했다. – tompave

+0

"실제 사용"이 아닌 코드로 사용하면 실수로 "실제"코드에서 실수로 사용하거나 나중에 변경하는 것을 잊어 버릴 가능성이 높아집니다. –

답변

2

class <<self은 실제로 자체 수업을 열지 않습니다. 자기의 싱글 톤 클래스를 엽니 다. (here을 설명했다.)

class Foo 
    class << self 
    @bar = "baz" # not really inside Class here. 
    end 
end 

Foo.singleton_class.instance_eval { @bar } #baz 

예후 다 카츠 정말 여기에서 무슨 일이 일어나고 있는지 설명하는 좋은 article 있습니다.

+0

예, 알고 있습니다. 현재 범위에서'self'가 가리키는 것의 싱글 톤 클래스를 엽니 다. 클래스 (MyClass) 본문 내에서 사용되면,'self'는'MyClass'와 같습니다. 어떤 클래스 ('String','MyClass', ecc)는'Class' 클래스의 인스턴스 일뿐입니다. 클래스에 대한 클래스 인스턴스 변수를 선언 할 수있는 방법입니다. 객체이기도합니다. – tompave

+0

어쨌든,'@ what_about_this' 변수에 대한 생각은? – tompave

+0

인스턴스 변수가 어디로 갔는지 물어 보았습니다. 나는 당신에게 말했다. 그것은 당신의 클래스의 싱글 톤 클래스 (a.k.a 그것의 고유 클래스)에있다. 이것은 클래스 자체와 같지 않다. –

관련 문제