本帖最后由 忧雪の伤 于 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 中有提到,所以就不列出來了。
實際上我們可以用上面給出的兩種方法試著復原同樣的效果。自己去試試吧~ |