この章ではモジュールについて説明します。
モジュールは「メソッドをひとまとめにしたもの」です。
クラスはインスタンス変数やメソッドをまとめたものですが、モジュールはメソッドをまとめたものです。
モジュールの基本構文は次の通りです。 〇モジュール名の先頭は大文字で始めなくてはいけません。
〇モジュールの中にはメソッドや定数を入れることが出来ます。
〇また、モジュールはオブジェクトも継承も作ることはできません。
では例をみてみましょう。 モジュールの中のメソッドを通常のメソッドのように実行するにはモジュール内のメソッドをを使用して、モジュールのメソッドとして設定します。
それが以下の箇所です。 モジュールのメソッドを実行するにはと指定しますが、それが以下の箇所です。 結果は以下の通りです。 次はクラスの中でモジュールをincludeする例です。 クラスの中や任意の場所にモジュールを入れ込むには前の例で説明した通りという形式で書きます。 以下の赤枠の箇所がTestクラスの中でZeiModuleモジュールを取り入れている箇所です。 以下のようにTestクラスの中のresultメソッドを呼び出すことで、ZeiModuleモジュールの中のshouhizeiメソッドを呼び出しています。
test.result(150000);
結果は以下の通りです。
カテゴリー: Ruby
アクセス装飾子について知ろう
この章ではアクセス装飾子について説明します。
アクセス装飾子とはメソッドに対してのアクセスを制御するための装飾子です。
Rubyのアクセス装飾子はpublic、protected、private があります。
privateは子クラスのメソッドから親クラスのprivateのメソッドを呼び出すことが可能です。
publicはどこからでも使うことができます。
いままでメソッドにはアクセス装飾子を付けていませんでしたが、アクセス装飾子を付けないとpublicに指定したのと同じ意味になります。
publicが付いたメソッドはどこからでも使うことができるので、子クラスからでも親クラスのメソッドにアクセスできます。
protectedはメソッドを子クラスの中から使えます。
それと自身のクラスの中ではインスタンスメソッドとして使えます。
アクセス装飾子の詳しい説明は例の後に行います。
では例をみてみましょう。 初めに2種類のアクセル装飾子の指定方法について説明します。
1つ目は例の通り,メソッドの上にアクセス装飾子を指定する方法です。
この方法は複数のメソッドに対しても適応可能です。
例えば以下のようにsample123メソッド、sample456メソッドに対し1つのprivateで指定することができます。 2つ目はと言う形式で指定する方法です。
この方法は個別のメソッドに設定します。 次はprivateの使い方について説明します。
①親クラスの中でprivateをメソッドに付けると親クラスや子クラスのオブジェクトからそのメソッドを呼び出すこはできません。 ②子クラスのメソッドから親クラスのprivateのメソッドを呼び出すことが可能です。
クラスの中のメソッドからのみprivateのメソッドは実行できます。 〇同じクラス内のメソッドからprivateのメソッドを呼び出すことは出来ます。
次はprotectedについて説明します。
では例をみてみましょう。 ① 子クラスのメソッドから親クラスのprotectedのメソッドを呼び出すことが可能です。 また、privateでは出来ませんが、のようにオブジェクト自身を子クラスのメソッドに送って、そこからprotected指定のメソッドを呼び出すことが出来ます。
つまり、はオブジェクトのを引数にしてという形態でprotected指定のsampleメソッドを呼び出します。
結果は以下の通りです。
②以下のように子クラスのメソッドから直接、親クラスのprotectedメソッドに接続できません。
③以下の通り、同じクラス内のメソッドからprotectedのメソッドを呼び出すことは出来ます。
showメソッド内でprotectedのkeisanメソッドを呼び出しています。 以上でprivateとprotectedの説明は終わりにしますが、この他にpublicがありますが、この装飾子はどこからでもアクセスできる装飾子で、あえてと宣言しなくても、何も付けていなければそのメソッドはpublicを意味します。
クラスの継承について説明します
この章ではクラスの継承について説明します。
クラスの継承とは元々あるクラスを拡張して、新しいクラスを作成することを言います。新しいクラスを作成するのに元のクラスと変数やメソッドが重なった場合, 元のクラスの機能を使える仕組みが継承です。
つまり、新しいクラスをゼロから作成するのではなく、元のクラスの機能を借りて新しいクラスを作成する仕組みが継承です。
元のクラスを親クラス(スーパークラスとも言います)、その親クラスを受け継いだクラスを子クラス(サブクラスとも言います)と言います。 では少し長いですが例をみてみましょう。 では説明を始めていきます。
この例では親クラスのBankクラスを受け継いだShoukenクラスを作成しています。
その子クラスの中には親クラスにはない子クラス独自のメソッドや変数を書きます。
なぜなら、子クラスは親クラスのメソッドや変数を全て使うことができるので、あえて親クラスのメソッドや変数を書く必要が無いからです。
ではどこで親クラスの変数を取得しているかと言いますとです。
superとは親クラスを意味します。
子クラスの中でsuperはinitializeメソッドの中にありますが、この場合にはsuperは親クラスのinitializeメソッドを呼ぶことを意味します。
子クラスのメソッドの中でsuperを使うとそのメソッド名と同名のメソッドを親クラスから呼び出すことができます。
この例では子クラスのinitializeメソッドの中でsuperを使っているので親クラスのinitializeメソッドを呼び出すことができます。 super(name,age,money)の箇所は以下の作業をしています。
オブジェクトの引数が親クラスのinitializeメソッドの中のインスタンス変数に代入されます。 そして、initializeメソッドの引数aは@company1に代入されます。 その他にもこの例では以下のように子クラスのresultメソッドからsuperを使って、親クラスのresultメソッドを呼び出しています。 実はこのresultメソッドは親クラスにも子クラスにもありますが、このように子クラスの中で親クラスと同じ名前で中身だけが違うメソッドを作ることが出来ます。
これをオーバーライドと言います。
先ほども書きましたが、superの機能を詳しく言いますと子クラスの中のオーバーライドしているメソッドの中にsuperを記述すると親クラスの中の同名のメソッドを呼び出すことができます。
例えば上の例では子クラスのresultメソッドから親クラスのresultメソッドを呼び出しています。
では次の箇所の説明をします。 複数の箇所でを使っていますが、「+」は文字列同士を連結する機能がありますので、オブジェクトが数値の場合にはを使用して、文字列に変換してください。 結果は以下の通りです。
selfについて知ろう
この章ではselfについて説明します。
では例をみてみましょう。 selfはメソッド内で実行されると、そのメソッドを実行しているオブジェクト自身を参照することが出来ます。
この例ではchangeメソッドの中でmyname変数の中身を変えていますが、ローカル変数とインスタンス変数の名前が同じです。
そこでselfをインスタンス変数の前にと言う形式で付けることでローカル変数ではなくでインスタンス変数を指し示すことが出来ます。 では次の例をみてみましょう。 では説明を始めます。
selfは他にもクラスメソッドを作成する際にも使われます。
クラスメソッドはと言う形式でしたが、と言う形式でも書くことも出来ます。
クラス変数について知ろう
この章ではクラス変数について説明します。
変数名の前に@@が付いた変数はクラス変数と呼ばれています。
クラス変数はインスタンス変数のようにインスタンスに属する変数と違ってクラスに属しています。
では例をみてみましょう。 前の章では変数名の前に@@が付いた変数はクラス変数であると説明しましたが、この例では@@count1がクラス変数です。このクラス変数はクラスの中のメソッドではない箇所で宣言します。
この例ではオブジェクトを2つ以下のように作っています。 インスタンス変数の場合はこの2つのオブジェクト間ではインスタンス変数の値を共有できません。まったく別個のインスタンス変数になります。
これとは逆にクラス変数はクラスに属しているので、オブジェクトごとにクラス変数の値が変わるわけではありません。どんなに新しいオブジェクトを作成してもクラス変数を共有して使用することが出来ます。
以下の箇所ではオブジェクトを作成するたびにクラス変数であるcount1に1を足しています。 そして、以下の箇所でそれぞれのオブジェクトでcountメソッドを呼び出していますが、出力するとクラス変数@@count1がカウントされているのが解ります。 結果は以下の通りです。
クラスメソッドについて知ろう
この章ではクラスメソッドについて説明します。
クラスメソッドの前にクラス変数について説明します。
変数名の前に@@が付いた変数はクラス変数と呼ばれています。
クラス変数はインスタンス変数のようなオブジェクトに属する変数と違ってクラスに属している変数です。
クラスメソッドはインスタンスメソッドと違ってクラスから直接呼び出されるメソッドです。
クラスメソッドはオブジェクトを作成しなくてもクラスメソッドを使うことができます。
クラス変数は次の章で説明しますので、この章ではクラスメソッドの説明をします。
では例をみてみましょう。
では説明を始めます。
クラスメソッドの構文は以下の通りです。 クラスメソッドの特徴はクラスから直接メソッドを呼び出せることです。
つまり、newでオブジェクトを作成しなくてもメソッドが呼び出せます。
クラスメソッドはという構文で作成します。 クラスメソッドを呼び出すには のようにと言う形式で書きます。
結果は「10900」です。
クラスについて知ろう
この章ではクラスについて説明します。
今までのプログラムでは変数とメソッドを扱ってきましたが、クラスと言う機能を使うことで、多くの変数とメソッドを1つの機能体として働かせてデータを処理することが出来ます。
クラスとは物を作る設計図に例えられます。設計図は車や家や鉛筆をつくる場合に必要ですが、この設計図に当たるものがクラスです。
例えば車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
鉛筆であれば「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」をメソッドで書くことになります。
その「状態」や「ふるまい」に指示を出すのはオブジェクトの役割です。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
クラスの基本構文は以下の通りです。 クラス名の初めの一文字目は大文字のアルファベットで書きます。
classとendの間に変数やメソッドなどを記述して、クラスの中身を作ります。
クラスはただの設計図なので、このクラスに指示を出す必要がありますが、それがオブジェクトです。 〇引数は省略できます。
〇このオブジェクトはインスタンスとも呼ばれています。
ではクラスの例を見てみましょう。 クラスの中に@ マークの付いている変数がありますが、これはインスタンス変数と呼ばれていまして、クラスの中で使われます。 =>オブジェクトの基本構文はと、説明しましたが、このオブジェクトを作成する過程でクラスの中のinitializeメソッドを自動的に呼び出してくれます。nyuukinメソッドやshukkinメソッドは自身で作ったメソッドですが、このinitializeメソッドはRubyであらかじめ定義されているメソッドです。
そしてこのの中の引数100000がinitializeメソッドの引数(この例ではc)に入ります。
他の言語ではコンストラクタと呼ばれる機能です。
このようにinitializeメソッドを使ってインスタンス変数に値を設定することが出来ます。
また以下の通り、初めからインスタンス変数に値を設定することもできます。
その場合にはのように引数を省略できます。 次に以下の箇所の説明をします。 =>クラス内のメソッドにデータを渡すにはという形式で書きます。
そうするとクラス内のメソッドが実行されます。
最後にshowメソッドを出力するとnyuukinメソッドやshukkinメソッドで計算された結果が入っている@zandakaが返されますので、これをprintで出力しています。
結果は「91000」です。
次の例はinitializeメソッドの引数にデフォルト値を設定する例です。 初期値を設定するときには以下のようにとデフォルト値を設定してください。
メソッドの章で説明した通り、メソッドにはあらかじめ値を設定することができます。 このようにメソッドに引数を設定した時にはオブジェクトの引数をカラにしても、そのメソッドの引数の設定値が使用されます。
先ほども説明しましたが、もう一度クラスの中のメソッドを呼び出す方法について説明します。
この例ではクラスの中で3つのメソッドを定義しています。 これらのメソッドを使用するためにはという構文で書きます(initializeメソッドだけはオブジェクトを作成過程で自動的に呼び出されるので、明示的にこの構文を使う必要はありません)。
この構文でメソッドにデータを入れていきます。この例では以下のように書いています。 引数が無い場合にはshowメソッドのように省略することができます。 これらのメソッドはオブジェクトからアクセスするのでインスタンスメソッドと言います。
今までのトップレベルのメソッドはのようにメソッド名だけでメソッドを呼び出していましたが、オブジェクトから呼び出す場合はで書くことを覚えておいてください。
次にインスタンス変数について説明します。
インスタンス変数はインスタンスメソッドからのみ参照できますので、メソッドを通してインスタンス変数の値を取得します。
ですので、この例ではすべてメソッドの中でインスタンス変数の値を足したり、引いたりしています。
では次の説明に進みます。
オブジェクトは1つだけではなく、次のように変数を変えていただくと何個でも作ることが出来ます。
例えばこの例ではbooksとbooks2の2つを作成しています。 オブジェクトをたくさん作成してもインスタンス変数はオブジェクトごとに値が設定されますので、booksの@zandakaとbooks2の@zandakaの間には関係性はありません。
結果は以下の通りです。
では次の例を見てみましょう。 では説明をしていきます。
initializeメソッドでインスタンス変数に値を設定することもできますし、setメソッド(メソッド名はsetを付けなくても構いません)を使っても値を設定することができます。
この例ではsetメソッドで設定した値でinitializeメソッドで設定した値を上書きしていますが、initializeメソッドで設定したデータよりsetメソッドで設定したデータの方が優先されます。
setメソッドだけで値を設定したい場合にはinitializeメソッドは書かなくても結構です。
ではsetメソッドについて説明します。
インスタンス変数に値をセットするためにはinitializeメソッドやsetメソッドを通常使用します。 =>「set..」というのはインスタンス変数の値を設定する時に使います。
特に「set..」で書かなくてはならないという決まりがあるわけではありませんが、解りやすいので慣習になっています。
通常はインスタンス変数ごとにsetメソッドを書きます。
次はgetメソッドについて説明します。 =>「get..」と言うのは値を呼び出し元に返す時に使います。
特に「get..」で書かなくてはならないと言う決まりがあるわけではありませんが、解りやすいので慣習になっています。
通常はインスタンス変数ごとにgetメソッドを書きます。
getメソッドは値を返すために作られるメソッドです。
結果は以下の通りです。 しかし、インスタンス変数の数だけ、このようなメソッドを書くのは面倒に思いませんか?
そこでRubyにはそれを簡潔にする機能が備わっています。
次の例で説明します。 では説明を始めます。
と、書くことで例えば本来ならばsetNameメソッドとgetNameメソッドを2つ書かなくてはいけませんでしたが、と書くだけでこれらの2つのメソッドと同じことを行わせることが出来ます。
このの中の変数に値を設定するにはという構文で入れていきます。
この例では以下のように入れています。 インスタンス変数の値を出力するにはという構文で記述します。
この例では以下の箇所です。 では次の例に進みます。 では説明を始めます。 「attr_writer :変数名」は以下のようなsetメソッドと同じ役割があります。 「attr_reader :変数名」は以下のようなgetメソッドと同じ役割があります。 使い方はと同じです。
星座判定メソッドを作ろう
この章では配列、if文、メソッドを使用して、星座判定システムを作成します。 =>getsメソッドはユーザーがキーボードから入力した文字列を返します。
そして、その文字列をで整数に変換します。前の章では自身でメソッドを作ってきましたが、getsメソッドなどはRubyであらかじめ機能が定義されているメソッドです。
つまり、このメソッドはユーザーが入力した文字列を整数値に変換するのですが、例え数字で入力したとしても、入力値は文字列として入力されるので、これを整数値に変換するのがです。
これらの2つのメソッドを「.」で繋ぎます。
このプログラムでは2か所ユーザー入力の箇所がありますが、それらがbirthmonthとbirthdayに代入されています。 この配列内は山羊座から順番通りに並んでいますので、決してランダムに並んでいるわけではありません。
day1には各星座の月の末日を配列に入れています。
day2には1月から12月までの末日を配列に入れています。 =>例えばmonthに1が入り、dayに19が入っているとします。
そうするとの部分でcountが0の時にifの条件式がtrueになりますので、入れ子のif文の条件式の判定に入ります。
このようにif文は入れ子にすることが出来ます。
つまり、初めのif文がtrueの場合に次のif文でさらに条件式を判定します。 「day <= day1[count]」の中のdayには19が入り、1周目のにはday1の0番目の要素である19が入っていますので、条件式はtrueになり、nameにはnames配列の0番目の要素であるやぎ座が入ります。
例えばdayに19ではなく23が入っていると仮定するとはfalseになるので、の条件式の判定に入ります。
ここでday2[count]にはday2の0番目の要素である31が入っていますのでtrueになり、name にはに該当する星座が入ります。
のcountには1周目では0が入っていますのでで余りを求めると1になります。
結果、names[1]となり、みずがめ座が入ることになります。
ではさらに、以下の箇所の詳しい説明をします。 「count + 1」の箇所の説明をしますと例えばmonthが1で、day が23の場合にはがになりfalseになるので、elsifのブロックに入りますが、1月は やぎ座とみずがめ座しかなく、やぎ座ではないのならばみずがめ座しかないのでnames配列を1つ進めるためにで1を足しています。
names.lengthを使っている理由は例えば の中のcountに11が入るとの箇所が12になりますが、の箇所が無いと仮定するととなってしまいますが、実際にという要素はありません。
そこでで余りを0(12割る12で余り0)にして山羊座が出るように設計しています。
つまり、該当する以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。 最後にreturnで返ってきたnamesの値がjuに入り、printで出力します。
結果は以下の通りです。
メソッドについて知ろう
この章ではメソッドについて説明します。
メソッドとは引数と言うデータを受け取って、ある一定の処理を行い、戻り値を呼び出し元に返す命令のことを言います。
引数とはメソッドを実行するときにメソッドが使うデータのことを言います。戻り値とは、メソッドを実行した結果、返される値です。
簡単に言いますと「このデータ(これは引数に相当します)を渡すので、この作業をやってくださいね」と命令するとメソッドという機械が作業をしてくれて、その結果(戻り値)を返してくれるというのが一連メソッドの流れです。
例えば「消費税を自動で計算するメソッド」を自分で作りたいとします。
その場合、商品の代金をメソッドに渡すと商品金額に税率を掛けた処理をして、その結果を返すというメソッドを作ることになります。
このような一連の処理を作ることをメソッドを定義すると言います。
通常メソッドはクラス(クラスについては「クラスについて知ろう」で説明します)の中に書きますが、クラスの中ではなくても書くことが出来ます。
クラスの中ではない位置はトップレベルと呼ばれています。これまでの学習ではまだクラスの説明をしていないので、すべてトップレベルで記述してきました。
ここではクラスの中のメソッドではなく、トップレベルでのメソッドの記述方法について説明します。 〇このメソッドの構文の中にある引数を仮引数と言います。
先ほどの書きましたが引数とはメソッドの中で使われるデータのことです。
引数1を第1引数、引数2を第2引数と言いますが、引数の数はメソッドにより変わります。
〇メソッド名の付け方は基本的には変数の命名規則と同じですが、変数と違って大文字のアルファベットも可能です。
〇引数が複数ある場合はカンマで区切りますが、引数が必要ないメソッドであるならば引数は省略することができます。
実はメソッドは定義しただけでは機能しません。
メソッドを実行するためにはメソッドを呼び出さなくてはいけません。 今のところはクラスの説明をしていないので、この章ではトップレベルにメソッドが書かれていた場合でのメソッドの呼び出し方について説明します。
〇メソッドの呼び出しの中にある引数を実引数と言います。
〇引数が複数ある場合はカンマで区切りますが、引数が必要ないメソッドであるならば引数は省略することが出来ます。
では例をみてみましょう。 =>このメソッドは足し算を行うと言う機能を持っています。
このメソッドの中にある引数a,bはこのメソッドが実行されている間だけ有効な引数なので関数の外で出力することは出来ません。これをローカル変数と言います。
このメソッドを呼び出している箇所がです。
つまり、という形式でメソッドを呼び出します。
この引数の2はメソッドの中の引数aにセットされ、3はメソッドの中の引数bにセットされます。
そして、このメソッドを実行した結果をの箇所で出力しています。 この例の結果は5が出力されます。
ここで注意してほしいことはメソッドの呼び出しよりも、メソッドの定義を後に書かないでください。
つまり、以下の例はエラーになります。
次は仮引数にあらかじめ初期値を設定する方法について説明します。
初期値を設定するすると、メソッドの呼び出しの際に実引数を設定する必要はありません。
では例をみてみましょう。 実引数がのようにカラですのでメソッドの仮引数が使われます。
つまり、aが2、bが3と、仮引数が設定してありますので、この値が使われます。
このように仮引数に値が設定してあれば実引数を省略することが出来ます。
結果は5が出力されます。
仮引数に初期値を設定した場合でも、実引数を設定しても問題ありません。
その場合は実引数が使われます。
では例をみてみましょう。 実引数と仮引数の両方に引数の値を設定していますが、実引数の5と8が優先されますので、結果は13です。
次の例は仮引数を2つ設定して、実引数を1つしか設定しなかった場合はどうなるか見てみます。 この場合は仮引数aに8が代入されるので、仮引数 aの2は使われません。
bはそのまま3が使われます。
結果は11です。
次は実引数と仮引数の数が合わない場合の例です。 実引数が3つで、仮引数が2つなので、実引数が1つ多いです。
結果は次の通りエラーです。 意味は引数の数が間違っていますと書かれています。
次は仮引数を設定する場合の注意点について説明します。
では例をみてみましょう。 仮引数の設定値はすべてを設定する必要はなく、例えば例のように2つの引数の中の1つだけを設定することも出来ます。
しかし、メソッド内の引数の設定は右端からしてください。
つまり のように、第1引数(先頭の引数)だけを設定して、後の引数を設定しないという形式は取ることができません。
次は実引数に変数を使った例について説明します。 のように実引数に変数を使用することも出来ます。
次はメソッドに配列を渡す方法について説明します。
では例をみてみましょう。 では説明をしていきます。 そして、計算の後にその結果を呼び出し元のに戻します。
このようにメソッドの実行結果をメソッドの呼び出し側に返すにはreturnを使います。
具体的にはと言う形式で書きます。
例ではの箇所です。 結果は「答えは530」です。
この例の流れを図にしましたので参考にしてください。 次の例もメソッドに配列を渡しているのですが、前の例とは違う形態で渡します。
では例をみてみましょう。 前の例では配列をメソッドに渡した後に、その配列から要素を取り出すためにfor文を使っていましたが、この例ではメソッドに引数を渡すときに実引数の先頭に「*」を付けて、仮引数で個別に要素を受け取ります。
配列である実引数の先頭に「*」を付けると仮引数では配列の要素が分解されて渡されます。
メソッド側には配列の要素の数だけ仮引数を用意してください。
2は仮引数aに入り、3は仮引数bに入り、8は仮引数 cに入ります。
結果は「答えは13」です。
前の例では実引数の先頭に「*」を付けましたが、今度は仮引数にも「*」を付ける例を紹介します。 実引数の配列名の前に「*」を付けるまでは前の例と同じですが、仮引数にも「*」を使用します。
仮引数の変数aにはが入り、残りの要素はに配列として入ります。
配列の実引数に「*」を付けて渡して、仮引数では「普通の変数と「*」を付けた変数」で受け取ると配列の要素を分けて代入することができます。
その後、配列の要素をfor文で処理しています。 結果をreturnで返しているのですが、この例の場合は2つの変数をのように返しています。
複数の変数を返す時にはカンマで区切って記述してください。
その戻り値をどのように受け取るかと言いますと、という形式で受け取ります。
この方法は複数の値を一度で受け取ることができます。これを多重代入と言います。
この例では以下の箇所です。 多重代入についてもう少し例を出して説明します。 では以下の場合にはどうでしょうか。 では次の例をみてみましょう。 では次の例をみてみましょう。 次の例はメソッドの中でヒアドキュメントを使った例です。 この例は与えた実引数の値をヒアドキュメントで出力しています。
結果は以下の通りです。
redoについて知ろう
この章ではredoについて説明します。
redoはnextの機能と似ていますが、少し注意が必要です。
redoについての詳しい説明は次の例の後にします。
では例をみてみましょう。 nextは条件にマッチしたら、先頭に戻ってループを続け、その周回の要素は出力されませんでした(「nextについて知ろう」の例では5だけが抜けていました)。
redoも条件にマッチしたら先頭に戻るのですが、同じ繰り返しをもう一度行います。
同じ繰り返しを行うので、5の要素も改めて出力されることになります。
しかし,カウントの値aはその間もカウントされていますので、配列の5の要素を出力するにしても、カウントaは6になっていますので、出力は「カウント6は5」になります。
結果は以下の通りです。