コードモンキー日本公式サイト

コードモンキーの最新情報やプログラミング学習に有益な各種情報をお届けします。


コードモンキーサポートデスクに寄せられたユーザーからのご質問およびコードモンキーサポートデスクからの回答を紹介しております。
今回寄せられたご質問は、コードの冒険メインモードNo.165のsafe関数におけるreturn no やreturn yesの使い方について


ユーザー様からのご質問

コードの冒険メインモードNo.165のコードについて解説してください。解答例は以下のコードになっていますが、これですべてのカラスを追い払うことができるのかがわかりません。

safe = () ->
    for c in crows
        if c.watching()
            return no
    return yes

#このコードはOK:
until safe()
    say "あっちへいけ!!"

goto banana

サポートデスクからの回答

いつもコードモンキーをご利用いただきありがとうございます。
いただいたご質問につき回答いたします。

メインモードNo.165では、5羽のカラスを追い払ってバナナを獲得するために、”safe”という名前の関数を定義してそれをuntilループの条件式にします。

コードの実行順序をわかりやすくするために、ここでのsafe関数をループを使わずに記述すると、以下のようなコードになります。

safe = () ->
    if crows[0].watching()
        return no
    if crows[1].watching()
        return no
    if crows[2].watching()
        return no
    if crows[3].watching()
        return no
    if crows[4].watching()
        return no
    return yes
returnが実行されると、その時点で関数は戻り値を返し、処理を中断する

上のコードのように、safe関数が呼び出されると、crows[0]からcrows[4]まですべてのカラス(crows)に対して、そのcrowsがwatchingであったらreturn noを実行するというコードが繰り返され、そしてすべてのcrowsがwatchingでなかったら最終行のreturn yesが実行されます。crowsのうちどれかひとつでもwatchingであったらreturnが実行されて関数の処理がその時点で中断されるため、最終行のreturn yesが実行されることはありません。

この関数safeの戻り値がnoになる場合とyesになる場合はそれぞれ以下のようになります。

[noになる場合]

  • crows[0]がwatchingであればreturn noが実行されて、safe関数はその時点で中断してnoを返す
  • crows[0]がwatchingでなくてもcrows[1]がwatchingであれば、safe関数はその時点で中断してnoを返す
  • crows[0]とcrows[1]がwatchingでなくてもcrows[2]がwatchingであれば、safe関数はその時点で中断してnoを返す
  • crows[0]とcrows[1]とcrows[2]がwatchingでなくてもcrows[3]がwatchingであれば、safe関数はその時点で中断してnoを返す
  • crows[0]とcrows[1]とcrows[2] とcrows[3]がwatchingでなくてもcrows[4]がwatchingであれば、safe関数はその時点で中断してnoを返す

[yesになる場合]

  • crows[0]もcrows[1]もcrows[2]もcrows[3]もcrows[4]もwatchingでなければ、最終行のreturn yesが実行されて、safe関数はyesを返す

次にunitilループの条件としてsafe()を呼び出す部分についてみていきます。

until safe()
    say "Go away"
goto banana

このようにuntilの条件としてsafe関数を呼び出すと、safe関数がyesになるまでuntilループが繰り返されることになりますので、
crows[0]とcrows[1]とcrows[2]とcrows[3]とcrows[4]のすべてのカラスがwatchingでなくなるまで say “Go away”が繰り返されます。
そしてすべてのcrowsがwatchingでなくなったらsafe()がようやく戻り値yesを返すため、その時はじめてuntil ループを抜けてgoto bananaが実行され、はれて安全にバナナをとりに行くことができる、というわけです。


以上、ご案内いたします。いかがでしたでしょうか。また不明点などありましたらお気軽にお問い合わせください。

引き続きコードモンキーをお楽しみくださいませ。

コードモンキーサポート