本帖最后由 忧雪の伤 于 2013-2-17 16:02 编辑  
 
 常量、變量補充 
 
 - 常量部份 -
 常量不能在方法中定義。但實際上在前者以外的情況可以再賦值,如果使用 irb 的話你會看到 warning 。 
  常量也有自己的作用域。這和全局變量不同。 
 例如。- Foo = Class.new
 
 - msgbox Foo
 
 - class Foo
 
 -   Bar = 0
 
 - end
 
 - p Bar # => NameError
 
  复制代码 常量的作用域是以當前作用域作為起始,一直適用所有往下的作用域。 
若想在外部访问类或模块中的常数时,要使用「::」操作符。 
例如。- class Foo
 
 -   Bar = 0
 
 - end
 
 - msgbox Foo::Bar
 
  复制代码 實際上這也可以直接賦值一個類裏的常量。- Foo = Class.new
 
 - Foo::Bar = 0
 
 - msgbox Foo::Bar
 
  复制代码
 - 變量部份 - 
  實例方法中定義的實例變量只在那個類的實例適用。而且每個實例的實例變量不會互相影響。不要天真的以為它們是共享的。- class Foo
 
 -   def foo
 
 -     @foo = 0
 
 -   end
 
 - end
 
 - Foo.new.foo
 
 - msgbox Foo.instance_variable_get :@foo # => nil
 
  复制代码 從另外一個角度來看就是。- class Foo
 
 -   @foo = 0
 
 -   def foo
 
 -     msgbox @foo
 
 -   end
 
 - end
 
 - Foo.new.foo # => nil
 
  复制代码 在這裡順便介紹兩個在外部操作對象的實例變量的方法。 
- Object#instance_variable_get(name)   
引用實例變量。 
name 就是實例變量的名字,可以為 Symbol 或者 String,例如 :@foo 。(注意別忘記 @ ) 
- Object#set_instance_variable(name, value)   
定義實例變量。 
name 同上。value 就是值。 
Ruby 方便我們讀寫實例中的實例變量,為我們提供了 attr 系列方法。這在 F1 中有提到,所以就不列出來了。 
實際上我們可以用上面給出的兩種方法試著復原同樣的效果。自己去試試吧~ |