2010-08-12 50 views
6

我想添加一個名爲「enabled?」的屬性到一個既有吸氣又有吸氣器的模型。然而,當我做到以下幾點:如何爲名稱以問號結尾的房產定義一個setter?

def enabled?= value 
    # .. logic goes here .. 
end 

我得到syntax error, unexpected '?', expecting '\n' or ';'

什麼我應該不是做?

+1

不要在變量名使用標點符號。 – DanDan 2010-08-12 14:28:37

+4

@DanDan:使用?對於布爾getters是紅寶石的標準,不這樣做會相當單一。 – sepp2k 2010-08-12 15:13:54

回答

10

是的,ruby語法只允許在方法名中使用?(如果它是最後一個字符),所以foo?=無效。你可以做的一件事情就是非常習慣,就是定義enabled?,enabledisable(或enable!disable!,如果你想強調他們是變異的方法)。

如果這不符合您的需求,您可以將方法命名爲enabled?enabled=,只是在名稱之間存在輕微的不一致性。

+0

[ 有關感嘆號通常表示的信息在[downcase和downcase之間的區別!在Ruby中](http://stackoverflow.com/questions/709229/difference-between-downcase-and-downcase-in-ruby/709271) – 2010-08-12 23:19:06

7

紅寶石中的方法名稱以小寫字母或下劃線開頭,可選地後跟大寫和小寫字母下劃線和小數點。方法名稱可以有選擇地以問號,感嘆號或等號結束。

所以你不能!

你可以按照定義的啓用爲按照通常的紅寶石成語: -

def enabled? 
    @enabled 
end 

def enabled=(value) 
    @enabled = value 
end 

來概括。如果你想將屬性公開給外部世界,那麼確保你的變量名將允許在方法名稱規則的範圍內。

0

名稱你的財產只是enabled

查詢方法只是語法糖,他們是不是故意要用作屬性或實例變量。如果你願意,你可以添加方法enabled?的語法糖。

0

我一直將我的布爾變量命名爲'is',如'isEnabled'。然後它具有與不需要複雜性的問號相同的含義。

+3

它會更好地遵循ruby/rails標準(似乎並不複雜'對我來說 - 只是?最後)。否則,與其他開發人員共享的代碼將很難閱讀,因爲讀者/維護人員現在必須使用您的代碼而不是標準方法,或者只是使用更差的代碼。我曾經最後用_yn自己做這件事,直到我學得更好 – 2011-07-18 12:29:05

+0

始終使用這些標準。如果你想走自己的路,請加入樂隊。 – 2014-10-10 14:00:54

1

一個小的變化將是別名getter方法,同時允許enabledenabled?

def enabled 
    @enabled 
end 

def enabled=(value) 
    @enabled = value 
end 

alias_method :enabled?, :enabled 
相關問題