[英]Is it OK to leave the [ and ] out for messages like at:ifAbsent: if you don't need a full block?
在Smalltalk(特別是Pharo / Squeak)中,我想知道是否可以省略“[”和“]”作為消息的參數,如:ifAbsent:如果你不需要一個塊,就像這樣;
^ bookTitles at: bookID ifAbsent: ''.
和
^ books at: bookID ifAbsent: nil.
代碼有效,因為(在Pharo / Squeak中)對象>>值只返回self。 但我想知道這種用法是如何接受的,或者你是否應該總是鍵入[和],即使你不關心參數是否被快速評估或多次評估。
簽名:
at: key ifAbsent: aBlock
聲明使用塊作為第二個參數的意圖...但Smalltalk不是強類型語言,那么,你可以通過什么樣的對象? 任何理解#value消息的類型,所以,在每種情況下都要注意#value的每個特定含義,但要利用多態性!
這就是Pharo的代碼評論家對類似情況的評價:
特殊消息中的非塊:
檢查特殊消息中不使用塊的方法。 Smalltalk的新手可能會編寫如下代碼:“aBoolean ifTrue:(self doSomething)”而不是正確的版本:“aBoolean ifTrue:[self doSomething]”。 即使這些代碼片段可能是正確的,編譯器也無法對它們進行優化。
這個規則可以在優化中找到,所以你可能會忽略它,但我認為無論如何使用塊都更好。
更新:
at:ifAbsent:
不是由此規則觸發的。 它沒有被編譯器優化。 因此在這種情況下優化不是使用塊的理由。
並非所有Smalltalk方言都在開箱即用的對象上實現#value,因此如果您提交了一個不理解#value的對象,您的代碼可能無法在其他Smalltalk方言上運行。
只要您知道#value的作用是您所期望的,就可以傳遞任何類型的對象,
你的代碼對於來自其他smalltalk方言的人來說可能看起來很奇怪,或者是Smalltallk的新手,因為他們知道你在這里傳遞的是一個Block,但是像#join:這樣的消息也會發送到一個字符集...
最后,我要說如果可移植性不是您的主要問題,請不要擔心。
我想說將它們排除在外並不是一個好主意。 如果你遺漏了parens,那么這個論點會被熱切地評估,並且會被發送#value。 因此,如果“slef doSomething”有副作用,那就太糟糕了。 如果#value做了你不期望的事情,例如也許是人為的,那也可能是壞事
bookTitles at:bookID ifAbsent:'缺少標題' - >'ISBN-000000'
如果您的代碼有效並且您是查看源代碼的唯一人員,那么可以。 如果其他人要查看源代碼,那么我會說空塊[]會更具可讀性。 但一般來說,如果你真的關心錯誤,最好不要冒險超出標准做法,因為沒有辦法保證你不會有任何問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.