
No.12ベストアンサー
- 回答日時:
>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
実際に上記のプログラムを実行してみてください。
No.11
- 回答日時:
class Fooの実体とは、Foo.new()の事でしょうか?
はい。Foo.new()が実行されると、class Fooのインスタンス(Class Fooの実体)が生成されます。
No.10
- 回答日時:
>この場合のインスタンスとは何を指しているのでしょうか?
回答:class Fooの実体を格納したものです。
クラスとインスタンスについては、下記を参照してください。
一般論
https://qiita.com/hoshi-takanori/items/0ad7e53cf …
Rubyのクラスとインスタンスを学ぼう
https://pikawaka.com/curriculums/programming-int …
Rubyクラスとインスタンスの違い
https://qiita.com/yamaday0u/items/dca132e46b390c …
No.9
- 回答日時:
>迅速な回答ありがとうございます。
返信遅くなってすみません。ケース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")
No.8
- 回答日時:
>それと、ケース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)の所でしょうか?
はい、そうです。
迅速な回答ありがとうございます。返信遅くなってすみません。ケース1で、initializeありで、initializeがないのですが、省略したのでしょうか?教えて頂けると幸いです。
No.7
- 回答日時:
>ちなみに、どういう仕組みで、プログラムが動いているのでしょうか
Foo.newが実行されると、
RubyはFooのインスタンスを作成します。
そして、Fooにinitializeが定義されていれば、そのinitializeを実行します。
なければ、実行しません。
そして、作成したインスタンスを返します。(pにインスタンスが格納されます)
その次に、p.say("yamada")が実行されると、
Foo内のsayが実行されます。
No.6
- 回答日時:
>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が表示されません。
No.5
- 回答日時:
No2です。
>newメソッドとinitializeメソッドをなぜ使わなくて良いのでしょうか?
>本当は、initializeメソッドが隠れていると言うことでしょうか?
「initializeメソッドをなぜ使わなくて良いのか」ということについては、
No4のartoo様が丁寧に説明されていますので、省略させていただきます。
「newメソッドをなぜ使わなくて良いのか」という指摘は、
具体的にどのようなことを言われているのでしょうか。
質問の意味がよくわかりませんでした。
No.4
- 回答日時:
> 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
No.3
- 回答日時:
> では、newメソッドだけ書かれていて、
> なぜ、initializeメソッドが書かれていない事もあるのでしょう
newメソッドが呼び出されると、そのクラスのインスタンス用に
メモリが確保された後、initializeメソッドが必ず呼び出されます。
ほとんどのクラスでは、インスタンス生成時にメンバ変数の値を
設定する必要があるのですが、まれにその作業が必要ないクラス
というものもあります。その歳、クラス定義にinitializeメソッドが
書かれていないと、全てのクラスのsuperクラスである
Objectクラスのinitializeメソッドが代わりに呼び出されます。
Objectクラスのinitializeメソッドは、何も実行しないメソッドです。
継承ってやつですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
Ruby 引数
Ruby
-
ruby loopメソッド 変数
Ruby
-
アセンブリ言語について。
その他(プログラミング・Web制作)
-
-
4
ruby loopメソッド 変数(再喝)
Ruby
-
5
Ruby require ライブラリー
Ruby
-
6
ルビー言語 csvファイル part2
Ruby
-
7
ルビー言語 ライブラリー
Ruby
-
8
ruby クラス・オブジェクト・インスタンス
Ruby
-
9
ruby while式
Ruby
-
10
ruby 配列
Ruby
-
11
Cのプログラムからアクセスできないファイル名の一括変更方法
C言語・C++・C#
-
12
HTML &CSSとHTML5&CSS3 違い
HTML・CSS
-
13
C言語 関数、変数の宣言について
C言語・C++・C#
-
14
以下のプログラムの実行結果はどうなると思いますか? その理由も教えてください。
Visual Basic(VBA)
-
15
Ruby 格納
Ruby
-
16
COPYコマンドで、最後に1文字「Hex1A」が付くのはなぜ?外し方は?
その他(プログラミング・Web制作)
-
17
プログラミング言語のバージョン確認について。
その他(プログラミング・Web制作)
-
18
ruby raise句
Ruby
-
19
ruby OpenURI::Meta
Ruby
-
20
ruby begin句
Ruby
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
英数字を含む文字列(0-9,A-Z)...
-
(再質問)エクセルのマクロボ...
-
Ruby require ライブラリー
-
ruby OpenURI::Meta
-
パソコンのスクリーンセーバー...
-
C言語の入力した文字を反転させ...
-
EXCEL 和暦入力
-
pandasでsqlite3にテーブル作成...
-
VBScriptでExcel(2019)上のデー...
-
よくTwitterで見かける #プログ...
-
WSLのUbuntuで、Railsのインス...
-
ruby while式
-
ruby loopメソッド 変数(再喝)
-
ruby 配列
-
ruby loopメソッド 変数
-
ruby クラス・オブジェクト・イ...
-
ルビー言語 ライブラリー 追記
-
ruby raise句
-
ruby begin句
-
ruby ensure句
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Ruby require ライブラリー
-
ruby loopメソッド 変数(再喝)
-
(再質問)エクセルのマクロボ...
-
ruby OpenURI::Meta
-
ruby while式
-
ruby loopメソッド 変数
-
1、Rstudioで回帰直線を求める...
-
パソコンのスクリーンセーバー...
-
ビーリアルのユーザー名を変え...
-
ruby 配列
-
C言語の入力した文字を反転させ...
-
ruby クラス・オブジェクト・イ...
-
ルビー言語 ライブラリー 追記
-
100万件越えCSVから条件を満た...
-
ルビー言語 csvファイル 続き
-
Ruby newメソッド
-
教えてください
-
ruby raise句
-
英数字を含む文字列(0-9,A-Z)...
-
pythonエラー
おすすめ情報
では、newメソッドだけ書かれていて、なぜ、initializeメソッドが書かれていない事もあるのでしょうか?教えて頂けると幸いです。
tatsumaru77様お久しぶりです!迅速な回答大変ありがとうございます!説明が難しすぎてよく分かりませんので、もう少し簡単に教えていただけると幸いです。newメソッドとinitializeメソッドをなぜ使わなくて良いのでしょうか?本当は、initializeメソッドが隠れていると言うことでしょうか?教えていただけると幸いです。
superクラスの中に、Objectクラスがあると言う事でしょうか?ちなみに、何が継承されたのかと言うと、newメソッドのクラスからinitializeメソッドのObjectクラスというふうになるのでしょうか?教えて頂けると幸いです。
すみません。initializeメソッドが記述されていない場合、そのinitializeメソッドはどうなるのかが分からないという事です。教えて頂けると幸いです。
迅速な回答ありがとうございます。所で、newメソッドの後に、initializeメソッドが来るのかと思ったのですが、違うのですね。ちなみに、どういう仕組みで、プログラムが動いているのでしょうか?教えて頂けると幸いです。
迅速な回答ありがとうございます。返信遅くなってすみません。Foo内のsayが実行されますとは、say(name)の所でしょうか?それと、ケース2の所で、class Fooにしているのは、なぜでしょうか?教えて頂けると幸いです。
迅速な回答ありがとうございます。返信遅くなってすみません。ケース1で、initializeありで、initializeがないのですが、省略したのでしょうか?教えて頂けると幸いです。
迅速な回答ありがとうございます。質問なのですが、プログラムの仕組みについての所で、
そして、作成したインスタンスを返します。(pにインスタンスが格納されます)
と書かれていますが、この場合のインスタンスとは何を指しているのでしょうか?教えて頂けると幸いです。
class Fooの実体とは、Foo.new()の事でしょうか?教えて頂けると幸いです。
迅速な回答ありがとうございます。質問ですが、initializeの初期化とは、どういう感じなのでしょうか?プログラムの例と、解説を教えて頂けると幸いです。