簡體   English   中英

是否可以將[和]保留為以下消息:ifAbsent:如果您不需要完整的塊?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM