2013-03-20 55 views
1

例如,在Fog gem的代碼片段中,例如,爲什麼人們有時在非Ruby類中使用實例變量?

require 'rubygems' 
require 'fog' 

# create a connection to the service 
dns = Fog::DNS.new({ 
    :provider  => 'Zerigo', 
    :zerigo_email => ZERIGO_EMAIL, 
    :zerigo_token => ZERIGO_TOKEN 
}) 


zone = @dns.zones.create(
    :domain => 'example.com', 
    :email => '[email protected]' 
) 

爲什麼dns不是實例變量在首位,但後來成爲下一段落的實例變量?爲什麼zone不是實例變量?

回答

1

這通常發生在使用屬性讀取器/寫入器時,如attr_readerattr_writer,attr_accessor。這些宏創建一個實例變量併爲其公開一個「getter」方法,一個「setter」方法或兩者。在實例方法內部,實例變量總是可以訪問的。

關於該示例中使用的特定代碼,看起來dns是一個標準局部變量。如果它實際上是一個屬性訪問器,它應該被寫爲:

self.dns = Fog::DNS.new({... 

因爲屬性訪問器實際上是一種方法,而不是一個局部變量。因此,在聲明它爲局部變量之後,它不能簡單地'變成'實例變量,並且其當前代表的示例代碼是對真實世界使用的不準確表示。

相關問題