2010-05-10 129 views
5

我是Ruby和Ruby on Rails領域的新手。我已經閱讀了一些指南,但是我遇到了以下語法方面的問題。 我認爲:condition語法的使用Ruby中用於定義一個類屬性與某種訪問,如:這是什麼意思?這意味着Ruby on Rails?

class Sample 
    attr_accessor :condition 
end 

隱含聲明瞭「條件」屬性的getter和setter。 雖然我正在看一些Rails示例代碼,但我發現以下示例並不完全理解。

例如:

@post = Post.find(params[:id]) 

爲什麼它的訪問id屬性與此語法,而不是:

@post = Post.find(params[id]) 


或者,例如:

@posts = Post.find(:all) 

:all這裏常數?如果不是,這個代碼真的意味着什麼?不使用如果是,爲什麼以下內容:

@posts = Post.find(ALL) 

感謝

回答

10

文本之前冒號表示在Ruby 符號。符號有點像常量,但它幾乎就像一個符號接收一個獨特的值(你不關心)作爲它的常量值。

當用作散列索引時,符號幾乎(但不完全)與使用字符串相同。

此外,您可以通過在符號上調用to_s來從:all中讀取「全部」。如果你有一個恆定的變量ALL,除了查看它的價值之外,沒有辦法確定它意味着「全部」。這也是爲什麼您可以使用符號作爲元方法的參數,如attr_accessorattr_reader等。您可能需要read up on Ruby symbols

+0

所以在我看來,一個符號看起來像Java或c#中的枚舉值,對吧? – Mark 2010-05-10 17:33:58

+0

@Marco:不,Ruby中的符號與枚舉值無關。它們更像是Lisp中的符號或者Smalltalk中的符號。 – 2010-05-10 17:40:42

+0

明白了,謝謝! – Mark 2010-05-10 17:50:17

0

這與Rails無關,它只是Ruby的Symbols:all是一個實際上只是一個基本字符串的符號。

1

:all是一個符號。符號是Ruby的版本interned strings。你可以這樣想:有一個叫做symbols的隱形全局表,它有String個鍵和Fixnum的值。通過調用.to_sym可以將任何字符串轉換爲符號,該字符串將查找表中的字符串。如果該字符串已經在表格中,則返回Fixnum,否則它將它輸入到表格中並返回下一個Fixnum。正因爲如此,符號在運行時就像Fixnums處理:比較時間是恆定的

您可以驗證這通過查看對象的object_id(在C的說法,符號的比較可以與==代替strcmp完成) ;當兩件東西的object_id相同時,它們都指向同一個對象。

你可以看到,你可以在兩個字符串轉換爲符號,他們都會有相同的對象ID:

"all".to_sym.object_id == "all".to_sym.object_id #=> true

"all".to_sym.object_id == :all.object_id #=> true

但反之則不然:(每打電話符號#to_s將產生一個全新的字符串)

:all.to_s.object_id == :all.to_s.object_id #=> false

1

不要將符號看作是一種節省內存的方式。將它們看作是指示該字符串應該是不可變的。 13 Ways of Looking at a Ruby Symbol提供了多種查看符號的方法。

要使用隱喻:符號用於多項選擇測試,字符串用於短文問題。