2011-09-24 30 views
9

我想知道爲什麼編寫File庫的人決定做出決定文件在字符串而不是符號中打開的模式的參數。爲什麼不是File.new符號的參數而不是字符串?

例如,這是它的現在:

f = File.new('file', 'rw') 

但不會是一個更好的設計做

f = File.new('file', :rw) 

甚至

f = File.new(:file, :rw) 

例如?這似乎是使用它們的理想場所,因爲這個論證絕對不需要變化。

我很想知道它爲什麼出現這種方式。


更新:我剛剛讀完 a related question about symbols vs. strings,我認爲共識是符號不像字符串那樣廣爲人知,並且每個人都習慣使用字符串來索引散列表。然而,我認爲Ruby標準庫的設計者不會對符號這個主題表示無知,所以我不認爲這是正確的。

+5

這可能只是一個歷史文物,一直回到libc中的fopen。 –

+7

您是否建議爲'File.new'模式('r','w','+','a','b','t')的每個有效置換定義一個唯一的符號? – Gabe

+0

偉大的問題。你可以使用像'File :: RDWR'和'File :: CREAT'這樣的常量,但是我找不到關於它的文檔。 'File' [documentation](http://www.ruby-doc.org/core/classes/File.html)使用這些常量,但不解釋它們。 – rdvdijk

回答

2

我不是紅寶石歷史上的專家,但是當你想要一個方法的參數時,你真的有三個選擇:字符串,符號和靜態類。

例如,異常處理。每個異常實際上都是一個類Exception。

ArgumentError.is_a? Class 
=> True 

因此,您可以讓流的每個權限爲自己的類。但是這需要爲系統生成更多的類。

關於符號的事情是他們永遠不會被刪除。您生成的每個符號都會無限期保存;這就是爲什麼使用'.to_sym'這個方法輕鬆的原因。它導致內存泄漏。

字符串只是更容易操縱。如果你得到了用戶的輸入模式,你需要在你的代碼中的某個地方使用'.to_sym',或者至少需要一個大的switch語句。使用字符串,您可以直接將用戶輸入傳遞給方法(當然,如果您信任的話)。

另外,在C中,您將一個字符傳遞給文件I/O方法。紅寶石中沒有字符,只是字符串。看到紅寶石是如何構建在C上的,這可能是它來自何處。

1

它僅僅是從以前的語言文物。

+0

我不同意。你能用例子和創作者的任何陳述來備份你的主張嗎? –

+1

我不會查找所有較老的語言的文檔,並告訴你他們都使用這種字符串格式,但下面是來自另一種Web語言的示例:http://us3.php.net/manual/en/function .fopen.php – weexpectedTHIS

+0

好的,但爲什麼PHP做到這一點?是否因爲PHP作爲一種語言嚴重依賴於字符串?是否因爲PHP不支持像Perl這樣的符號?是因爲...? 即將發生的事情是您沒有提供證據表明這是一個答案,而不是您的意見。 –

相關問題