0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BlockClosure の実装例 

Last updated at Posted at 2025-09-12

導入

「Pharo でコードを書いてみよう(1)」で BlockClosure を紹介しましたが、実際にどのような場面で使用されているのかを示します。BlockClosure を使って実行を遅延するとどんなメリットがあるのか、より理解できると思います。

Smalltalk における判断のしかた

Smalltalk にも「if 文のようなもの」があります。どうしてそんな言い方をするかというと他言語で言う if 文とはちょっと実装方法が違うのです。

まずは以下の文を Playground で Do it してください。

3 = 3
  ifTrue: [Transcript show: 'O'; cr]
  ifFalse: [Transcript show: 'X'; cr]

Transcript に O が表示されたと思います。

3 = 4
  ifTrue: [Transcript show: 'O'; cr]
  ifFalse: [Transcript show: 'X'; cr]

今度は、Transcript に X が表示されたと思います。

よく観察すると、いわゆる if 文ではなく、ifTrue:ifFalse: メッセージであること、BlockClosure が使用されている事に気づくと思います。

Smalltalk における真偽値の扱い

3 = 3

これを Inspect it すると、True オブジェクトであることがわかります。

3 = 4

これを Inspect it すると False オブジェクトであることがわかります。

つまり先程示した「if 文のようなもの」は、実は True もしくは False オブジェクトに ifTrue:ifFalse: メッセージを送っているのです。System Browser でそれぞれ見てみましょう。

まず True クラスからです。
fig5.png
True クラスの ifTrue:ifFalse: メソッドは、trueAlternativeBlock に value メッセージを送るように実装されています。

次に False クラスです。
fig6.png
False クラスの ifTrue:ifFalse: メソッドは、falseAlternativeBlock に value メッセージを送るように実装されています。

ついでに Boolean クラスの ifTrue:ifFalse: メソッドも見ておきましょう。
fig7.png
自身のオブジェクトに subclassResponsibility メッセージを送っています。これは「サブクラスで応答しなければいけません」というエラーになります。Smalltalk はデバッガーを起動してエラーがあった事をあなたに伝えてきます。
現状は True クラスも False クラスも ifTrue:ifFalse: メソッドを実装しており、メッセージに応答できるので問題ありませんが、もし Boolean クラスのサブクラスに ifTrue:ifFalse: メソッドが実装されていないと、メソッドサーチによりスーパークラスである Boolean クラスの ifTrue:ifFalse: メソッドが実行されてしまいます。Boolean クラスの ifTrue:ifFalse: メソッドが実行されると subclassResponsibility メッセージが送信されてエラーになります。

おわりに

ifTrue:ifFalse: メソッドのように実装するクラスによって動作が変わることを「多態性(ポリモーフィズム)」と言い、オブジェクト指向言語において重要なテクニックです。

Smalltalk の「if 文らしきもの」の正体について理解できたでしょうか? Smalltalk において if 文は構文ではなく、オブジェクトへのメッセージ送信、BlockClosure による遅延実行、そしてクラスによって動作(ふるまい)を変える多態性によって実現されています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?