3 回答

TA貢獻1798條經驗 獲得超7個贊
一般約定是將do..end用于單行塊和大括號的花括號,但是這兩個例子之間也有區別,可以用這個例子說明:
puts [1,2,3].map{ |k| k+1 }
2
3
4
=> nil
puts [1,2,3].map do |k| k+1; end
#<Enumerator:0x0000010a06d140>
=> nil
這意味著{}具有比do..end更高的優先級,因此在決定要使用的內容時請記住這一點。
PS:在開發偏好時要記住的另一個例子。
以下代碼:
task :rake => pre_rake_task do
something
end
真正意思:
task(:rake => pre_rake_task){ something }
這段代碼:
task :rake => pre_rake_task {
something
}
真正意思:
task :rake => (pre_rake_task { something })
因此,要獲得您想要的實際定義,使用花括號,您必須執行以下操作:
task(:rake => pre_rake_task) {
something
}
也許使用大括號作為參數是你想要做的事情,但如果你不這樣做,最好在這些情況下使用do..end來避免這種混亂。

TA貢獻1884條經驗 獲得超4個贊
來自編程Ruby:
大括號具有很高的優先級; 確實有一個低優先級。如果方法調用具有未括在括號中的參數,則塊的大括號形式將綁定到最后一個參數,而不是整個調用。do表單將綁定到調用。
所以代碼
f param {do_something()}
param在代碼中將塊綁定到變量
f param do do_something() end
將塊綁定到函數f。
但是,如果將函數參數括在括號中,則這不是問題。

TA貢獻1744條經驗 獲得超4個贊
我投票支持do / end
該慣例適用do .. end于多線和{ ... }單線。
但是我喜歡do .. end更好,所以當我有一個襯墊時,do .. end無論如何都會使用它,但是像往常一樣將它格式化為三行中的do / end。這讓每個人都開心。
10.times do
puts ...
end
一個問題{ }是它是詩歌模式 - 敵對(因為它們緊緊地綁定到最后一個參數,而不是整個方法調用,所以你必須包括方法parens),在我看來,它們看起來并不那么好看。它們不是語句組,它們與哈希常量沖突以便于閱讀。
另外,我已經{ }在C程序中看到了足夠的內容。像往常一樣,Ruby的方式更好。只有一種類型的if塊,您永遠不必返回并將語句轉換為復合語句。
- 3 回答
- 0 關注
- 762 瀏覽
添加回答
舉報