7

Smalltalk (特に Pharo/Squeak) では、at:ifAbsent: if you don't need a block, like this; のようなメッセージの引数で "[" と "]" を省略してもよいかどうかを知りたいです。

^ bookTitles at: bookID ifAbsent: ''.

^ books at: bookID ifAbsent: nil.

コードが機能するのは、(Pharo/Squeak では) Object>>value が self を返すだけだからです。しかし、この使用法がどの程度受け入れられているか、または引数がすばやく評価されるか複数回評価されるかを気にしない場合でも [ と ] を常に入力する必要があるかどうかを知りたいです。

4

5 に答える 5

3

署名:

at: key ifAbsent: aBlock 

第2引数にブロックを使用する意向を宣言しているのですが… Smalltalkは厳密に型付けされた言語ではないので、どんなオブジェクトを渡すことができるのでしょうか? メッセージ #value を理解するすべての種類の #value のそれぞれの特定の意味に注意してください。ただし、ポリモーフィズムを利用してください!

于 2014-02-05T13:51:44.307 に答える
2

同様の状況について、Pharo のコード批評家は次のように述べています。

特別なメッセージの非ブロック:

特別なメッセージでブロックを使用しないメソッドをチェックします。Smalltalk に慣れていない人は、正しいバージョンの "aBoolean ifTrue: [self doSomething]" ではなく、"aBoolean ifTrue: (self doSomething)" のようなコードを書くかもしれません。これらのコードが正しい場合でも、コンパイラによって最適化することはできません。

このルールはOptimizationにありますので、おそらく無視することもできますが、とにかくブロックを使用する方が良いと思います。

アップデート:

at:ifAbsent:このルールによってトリガーされません。また、コンパイラによって最適化されていません。したがって、この場合、最適化はブロックを使用する理由にはなりません。

于 2014-02-01T12:23:44.213 に答える
2

すべての Smalltalk ダイアレクトがすぐにオブジェクトに #value を実装するわけではないため、#value を理解しないオブジェクトを渡した場合、コードは他の Smalltalk ダイアレクトで実行されない可能性があります。

#value の動作が期待どおりであることがわかっている限り、どのような種類のオブジェクトを渡してもかまいません。

あなたのコードは、他の smalltalk 方言から来た人や Smalltalk に慣れていない人には奇妙に見えるかもしれません。なぜなら、あなたがここで渡すものがブロックであることを知ったからです。

最後に、移植性が大きな問題ではない場合は心配しないでください。

于 2014-02-02T12:29:19.190 に答える
1

それらを除外するのは得策ではありません。括弧を省略した場合、引数は積極的に評価され、#value が送信されます。したがって、「sref doSomething」に副作用があるとしたら、それは悪いことです。#value が予期しないことを行う場合も悪い可能性があります。

bookTitles at: bookID ifAbsent: 'Missing title' -> 'ISBN-000000'

于 2014-02-02T06:40:07.093 に答える
0

コードが機能し、ソースを表示できるのが自分だけであれば、問題ありません。他の人がソースを表示する場合、空のブロック [] の方が読みやすいと思います。しかし、一般的に言えば、バグが本当に気になる場合は、標準的な慣行から逸脱しないことをお勧めします。問題が発生しないことを保証する方法がないためです。

于 2014-02-02T11:19:59.913 に答える