重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

newメソッドは、initializeメソッドを必ず使わなければならないという事はないのでしょうか?教えて頂けると幸いです。

質問者からの補足コメント

  • では、newメソッドだけ書かれていて、なぜ、initializeメソッドが書かれていない事もあるのでしょうか?教えて頂けると幸いです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2025/02/08 20:27
  • うーん・・・

    tatsumaru77様お久しぶりです!迅速な回答大変ありがとうございます!説明が難しすぎてよく分かりませんので、もう少し簡単に教えていただけると幸いです。newメソッドとinitializeメソッドをなぜ使わなくて良いのでしょうか?本当は、initializeメソッドが隠れていると言うことでしょうか?教えていただけると幸いです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2025/02/08 21:33
  • superクラスの中に、Objectクラスがあると言う事でしょうか?ちなみに、何が継承されたのかと言うと、newメソッドのクラスからinitializeメソッドのObjectクラスというふうになるのでしょうか?教えて頂けると幸いです。

    No.3の回答に寄せられた補足コメントです。 補足日時:2025/02/09 01:55
  • すみません。initializeメソッドが記述されていない場合、そのinitializeメソッドはどうなるのかが分からないという事です。教えて頂けると幸いです。

    No.5の回答に寄せられた補足コメントです。 補足日時:2025/02/09 22:31
  • 迅速な回答ありがとうございます。所で、newメソッドの後に、initializeメソッドが来るのかと思ったのですが、違うのですね。ちなみに、どういう仕組みで、プログラムが動いているのでしょうか?教えて頂けると幸いです。

    No.6の回答に寄せられた補足コメントです。 補足日時:2025/02/09 23:03
  • 迅速な回答ありがとうございます。返信遅くなってすみません。Foo内のsayが実行されますとは、say(name)の所でしょうか?それと、ケース2の所で、class Fooにしているのは、なぜでしょうか?教えて頂けると幸いです。

    No.7の回答に寄せられた補足コメントです。 補足日時:2025/02/11 13:59
  • 迅速な回答ありがとうございます。返信遅くなってすみません。ケース1で、initializeありで、initializeがないのですが、省略したのでしょうか?教えて頂けると幸いです。

    No.8の回答に寄せられた補足コメントです。 補足日時:2025/02/14 18:17
  • 迅速な回答ありがとうございます。質問なのですが、プログラムの仕組みについての所で、
    そして、作成したインスタンスを返します。(pにインスタンスが格納されます)
    と書かれていますが、この場合のインスタンスとは何を指しているのでしょうか?教えて頂けると幸いです。

    No.9の回答に寄せられた補足コメントです。 補足日時:2025/02/14 19:39
  • class Fooの実体とは、Foo.new()の事でしょうか?教えて頂けると幸いです。

    No.10の回答に寄せられた補足コメントです。 補足日時:2025/02/15 11:15
  • 迅速な回答ありがとうございます。質問ですが、initializeの初期化とは、どういう感じなのでしょうか?プログラムの例と、解説を教えて頂けると幸いです。

    No.11の回答に寄せられた補足コメントです。 補足日時:2025/02/15 21:06

A 回答 (12件中1~10件)

>initializeの初期化とは、どういう感じなのでしょうか?プログラムの例と、解説を教えて頂けると幸いです。




initializeメソッドで、インスタンスの初期化を行います。
プログラムサンプル
------------------------------------------------------------
class Foo
def initialize(name,age)
@name = name #名前
@age = age #年齢
end
def say()
puts("My name is " + @name)
puts("I am " + @age.to_s + "years old")
end
end
p1 = Foo.new("yamada",18)
p2 = Foo.new("satou",20)
p1.say()
p2.say()
-----------------------------------------------------
上記の例では、initializeの引数としてnameとageがあります。
newで指定した引数がそのままinitializeの引数として渡ります。
従って、
p1 = Foo.new("yamada",18)を実行すると
initializeのnameに"yamada"が設定され、ageに18が設定され
initializeが実行されます。
その結果として、
@nameには"yamada"が設定され、@ageには18が設定されます。
この状態が、インスタンスとしてp1に格納されます。
同様に、
p2 = Foo.new("satou",20)
を行うと
@nameには"satou"が設定され、@ageには20が設定されます。
この状態が、インスタンスとしてp2に格納されます。

p1.say()を実行すると
My name is yamada
I am 18years old
と表示されます。

p2.say()を実行すると
My name is satou
I am 20years old

実際に上記のプログラムを実行してみてください。
    • good
    • 0

class Fooの実体とは、Foo.new()の事でしょうか?



はい。Foo.new()が実行されると、class Fooのインスタンス(Class Fooの実体)が生成されます。
この回答への補足あり
    • good
    • 0

>この場合のインスタンスとは何を指しているのでしょうか?


回答:class Fooの実体を格納したものです。

クラスとインスタンスについては、下記を参照してください。

一般論
https://qiita.com/hoshi-takanori/items/0ad7e53cf …


Rubyのクラスとインスタンスを学ぼう
https://pikawaka.com/curriculums/programming-int …


Rubyクラスとインスタンスの違い
https://qiita.com/yamaday0u/items/dca132e46b390c …
この回答への補足あり
    • good
    • 0

>迅速な回答ありがとうございます。

返信遅くなってすみません。ケース1で、initializeありで、initializeがないのですが、省略したのでしょうか?教えて頂けると幸いです。

申し訳ありません。間違ってケース2のほうをアップしてました。
正しくは、以下になります。
大変失礼いたしました。訂正いたします。

ケース1(initializeあり)
class Foo
def initialize()
puts("This is initialize")
end
def say(name)
puts("My name is " + name)
end
end
p = Foo.new()
p.say("yamada")
この回答への補足あり
    • good
    • 0

>それと、ケース2の所で、class Fooにしているのは、なぜでしょうか?



すみません。ケース1でclass Fooが漏れてました。
正しくは、以下のようになります。
ケース1(initializeあり)
class Foo
def say(name)
puts("My name is " + name)
end
end
p = Foo.new()
p.say("yamada")



>Foo内のsayが実行されますとは、say(name)の所でしょうか?
はい、そうです。
この回答への補足あり
    • good
    • 0
この回答へのお礼

迅速な回答ありがとうございます。返信遅くなってすみません。ケース1で、initializeありで、initializeがないのですが、省略したのでしょうか?教えて頂けると幸いです。

お礼日時:2025/02/14 18:15

>ちなみに、どういう仕組みで、プログラムが動いているのでしょうか



Foo.newが実行されると、
RubyはFooのインスタンスを作成します。
そして、Fooにinitializeが定義されていれば、そのinitializeを実行します。
なければ、実行しません。
そして、作成したインスタンスを返します。(pにインスタンスが格納されます)
その次に、p.say("yamada")が実行されると、
Foo内のsayが実行されます。
この回答への補足あり
    • good
    • 0

>initializeメソッドが記述されていない場合、そのinitializeメソッドはどうなるのかが分からないという事です。



その場合、initializeがないのでinitializeが実行されないだけです。

ケース1(initializeあり)
-----------------------------
def initialize()
puts("This is initialize")
end
def say(name)
puts("My name is " + name)
end
end
p = Foo.new()
p.say("yamada")
---------------------------
実行結果
This is initialize
My name is yamada


ケース2(initializeなし)
------------------------------
class Foo
def say(name)
puts("My name is " + name)
end
end
p = Foo.new()
p.say("yamada")
---------------------------
実行結果
My name is yamada


ケース2では、initializeメソッドがないので
This is initializeが表示されません。
この回答への補足あり
    • good
    • 0

No2です。


>newメソッドとinitializeメソッドをなぜ使わなくて良いのでしょうか?
>本当は、initializeメソッドが隠れていると言うことでしょうか?

「initializeメソッドをなぜ使わなくて良いのか」ということについては、
No4のartoo様が丁寧に説明されていますので、省略させていただきます。


「newメソッドをなぜ使わなくて良いのか」という指摘は、
具体的にどのようなことを言われているのでしょうか。
質問の意味がよくわかりませんでした。
この回答への補足あり
    • good
    • 0

> newメソッドは、initializeメソッドを必ず使わなければならないという事はないのでしょうか?教えて頂けると幸いです。



「newメソッド」というのは、Foo をクラス名とすると、Foo.new と書いたときのnewのことでしょうか?
Foo.newを実行すると、
1.Fooのクラスメソッドnewが定義されていない場合(普通の場合)
Fooクラスのオブジェクトが生成され、Fooクラスのinitializeプライベードメソッドが定義されていればそれが呼び出される。Fooクラスのinitializeプライベードメソッドが定義されていなければ親クラスのinitializeプライベードメソッドが定義されているかを、その親、その親と、順番に見ていく。

2.Fooのクラスメソッドnewが定義されている場合(普通はこんなことはしない)
そのクラスメソッドnewが呼び出される。これはたまたま名前がnewなだけで普通のクラスメソッドの呼び出しと同じ。つまり、Foo.newではFooクラスのオブジェクトの生成されない。
Fooクラスのオブジェクトを生成するなら、Foo.allocateで出来るがこのやり方で作った場合はinitializeは一切呼び出されない。

3.Fooのインスタンスメソッドnewが定義されている場合
これは、Foo.new の実行とは何の関係も無い。
Fooクラスのオブジェクトをxとすると、x.new を実行するとFooのインスタンスメソッドnewが実行される

> initializeメソッドを必ず使わなければならないという事
が、「initializeメソッドを必ず定義しなければならないのか?」という質問なら、「定義しなくて良いです」が回答です。定義しないと上述の通り親クラスがチェックされます。

> では、newメソッドだけ書かれていて、なぜ、initializeメソッドが書かれていない事もあるのでしょうか?教えて頂けると幸いです。

上記で説明済み。initializeは必要なければ書かない。
クラスメソッドnewは普通は定義しないのも上記で説明済み。
クラスメソッドnewは普通を定義したらどうなるかも上記で説明済み。

「newメソッドだけ書かれていて」のnewは、インスタンスメソッドなのでは?その場合も、上記で説明済み。

class Foo
def self.new
p "Fooクラスのクラスメソッドnew"
end
def new
p "Fooクラスのインスタンスメソッドnew"
end
ene
    • good
    • 0

> では、newメソッドだけ書かれていて、


> なぜ、initializeメソッドが書かれていない事もあるのでしょう

newメソッドが呼び出されると、そのクラスのインスタンス用に
メモリが確保された後、initializeメソッドが必ず呼び出されます。

ほとんどのクラスでは、インスタンス生成時にメンバ変数の値を
設定する必要があるのですが、まれにその作業が必要ないクラス
というものもあります。その歳、クラス定義にinitializeメソッドが
書かれていないと、全てのクラスのsuperクラスである
Objectクラスのinitializeメソッドが代わりに呼び出されます。
Objectクラスのinitializeメソッドは、何も実行しないメソッドです。
継承ってやつですね。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A