質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1791閲覧

Listに格納されたメソッドの呼び出し

akuta

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2016/11/24 04:15

こんにちは

ここのオセロゲームを
今Rubyで作ってみているのですが、

リンク

ここのところをRubyにうまく訳せません

C++

1 bool (*think[])(int) = {think1, think2}; 2 if ((*think[turn - 1])(turn)) {

違うだろうなと思いながらも自分でも書いてみたのですが、これだと動いた瞬間に黒駒がたくさん自動的に置かれるようになります

Ruby

1 list = [think1(turn),think2(turn)] 2 if list[turn - 1] then

ここはどういう風に書いたらよいのでしょうか?

よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Ruby

1def think1(i) 2 ... 3end 4 5def think2(i) 6 ... 7end

としているのであれば、

Ruby

1think = [method(:think1), method(:think2)] 2if think[turn - 1].call(turn) 3 ... 4end

とすることでうまくいくと思います。

以下、解説です。

Rubyは全てがオブジェクトといいながらも、メソッドそれ自体はオブジェクトとして直接操作できません。しかしオブジェクト化することはできます。それがObject#methodです。つまり、関数think1を関数ポインタとして配列にしたのと同じく、メソッドthink1をMethodオブジェクトとして配列にします。さて、Cでは関数名がそのまま関数ポインタとして扱えました。しかし、Rubyにおいてメソッドはレシーバ(メソッドの受け取り先)が何であるかが重要であり、必ずレシーバが存在します。そのため、レシーバ.method(メソッド名のシンボル)という形でレシーバを指定して、Methodオブジェクトを作らなければなりません。しかし、レシーバがselfであれば、省略が可能であり、この場合はself(mainというトップレベルの環境のオブジェクト)で呼び出すので、method(メソッド名のシンボル)とできます。

今度は呼び出し側です。MethodオブジェクトはProcオブジェクトと大変似た動作をします。これらは関数ポインタのような物なのですが、Rubyでは()は省略可能と言うことから、Cのように()を付けたら呼び出し、()がなければオブジェクトそのものという動作はできません。そこでRubyではcallメソッドで呼び出すとなっています(callには他にいくつかのエイリアスが存在します)。

ということで、上のコードになると言うことです。

投稿2016/11/24 10:29

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akuta

2016/11/26 06:20

ありがとうございます! 詳しく説明までしていただきよく理解できました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問