• ベストアンサー

プログラミングrubyでの質問

今、複合データ型のデータの集まりを作ってるんですが。 まあ、classをつくってその中に様々なデータを作っています。 えとわからないことがありまして、 classのインスタンスと属性、または属性値の違いってなんですか? インスタンス変数ってのは属性値のことですか? あとinitializeメソッドでインスタンス変数を初期化する意味はなんですか? 初期化するとどうなるんですか? 入門書を読んで独学で学習中なのですが、言葉の意味の例えが無くて 理解するのに頭が混乱してきました。助けてください。

noname#208914
noname#208914
  • Ruby
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>インスタンスと属性、または属性値 この場合の「属性値」というのはインスタンス変数のことだと思うのですが、そうすると違いと言うか当然まったくの別物ですね。 「インスタンス」は単純に言うと「何らかのクラスのオブジェクト」です。もちろんRubyではどんなオブジェクトも何らかのクラスに属しているわけですが、「インスタンス」と呼ぶ場合は特に @instance = SampleClass.new として生成したオブジェクトのことを一般的に指します。 >初期化する意味 簡単に言えば初期値が必要な場合です。 class TestClass  def initialize   @counter = 0  end  def count_up   @counter += 1  end end @n = TestClass.new @n.count_up こうすると意図が見えやすいでしょうか。 @counterの初期値は、もちろん0である必要はありませんが何らかの数値が入っていないといけません。でないとcount_upメソッド実行時に+=を実行できずエラーとなります(初期化していないインスタンス変数の値はnil)。

noname#208914
質問者

お礼

どうもありがとうございます。 参考になりました。

関連するQ&A

  • Ruby インスタンスの初期化について

    newメソッドを使わずにinitializeメソッドを定義しただけで インスタンスが作成されて初期化までされる理屈について 教えていただけないでしょうか? またクラスを作るときに基となっているObjectクラスとは一体 何物なのか、教えて頂きたい。 例 01:#Sampleクラスを作る 02:class Sample 03: #Samlpeクラスのインスタンスを初期化 04: def imitialize( lv, hp ) 05: end 06:end ↑の場合インスタンスlvとhpは、「lv = sample.new( 0 )」などと言う ように定義されてない。 それにnewメソッドでインスタンスを作りそこに数値の0を代入できるなら そもそもinitializeで初期化する必要は無いのではないでしょうか? 有識者の方いらっしゃいましたら、ご説明をよろしくお願いします。

    • ベストアンサー
    • Ruby
  • Ruby 特異メソッドのnewが先に実行?

    Rubyのインスタンス生成について質問があります。 通常クラスを定義する場合は class Hoge ; def hello(); pirnt "hello"; end であると思います。 ただ Hoge = Class.new(); でもクラスは定義できるとききました。 ただこの場合Hogeクラスに定義できるのは HogeというClassクラスから作られた特異クラスとしてのHogeに 特異メソッドのみを定義できるということですよね? 通常のインスタンスメソッドは定義できませんよね? ではでは、 hoge = Class.new(); とした場合はどうなるのでしょうか? この場合は Classクラスの純粋なインスタンスとなるのでしょうか? 前者の定義とおなじ仕方ですが代入先が、通常の変数です。 この場合は、クラスオブジェクトとして生成されるのですか? オンラインマニュアルをみたところ 「新しく名前の付いていない superclass のサブクラスを生成します。 superclass が省略された時にはObject のサブクラスを生成します。 名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。」 とあります。 上記内容は Classクラスの特異クラスとして定義されている特異メソッド(new)です。 これは Class.new()で作られたインスタンスを代入する先が定数であればその定数名と同じクラスを定義しつつそのClassクラスのクラスオブジェクトを生成するという意味合いでまちがいないでしょうか? 上記のとおりであれば hoge =Class.new()の場合は、やはりhogeというクラスを定義することになるのでしょうか? クラス定義は定数でなければならないはずですよね。 ただ実際、 p hoge;として出力すると#とひょうじされています。これはhogeがクラスオブジェクトではなく ただのインスタンスであるということでしょうか? であるならばこの hoge = Class.new()の式のnewはClassクラスオブジェクトに定義された特異メソッドではなく Classクラスに定義されたnewメソッド・・・・・つまりClassクラスに定義されたインスタンスメソッドの方のnewメソッドだとおもうのですが・・・・・・。 つまりこちらのメソッドですね。 「new( ... ) クラスのインスタンスを生成して返します。このメソッドの引数はブロック引数も含め initialize に渡されます。」 ※オンラインリファレンスから参照しました。 しかし 通常メソッドの検索は特異メソッドからはじまりその後クラスのインスタンスメソッド->親クラスのメソッドと 検索して行くとあります。 必ず先に、特異メソッドを実行しているはずだと思うのですが・・・。 やはり特異メソッドnewを実行しているのでしょうか? 長々すみませんが、ご教授ください。

    • ベストアンサー
    • Ruby
  • Ruby言語に関して質問です。

    Rubyで、クラス定義の際の質問です。 通常 cattle= Class.new(); で引数がデフォルトの場合は、Objectクラスのサブクラス生成すると 公式のリファレンスに記述があります。 調べてみると上記コードの場合は,cattleという無名クラスと呼ばれるものになるそうです。 この無名クラスとはYUGUIさんのサイトにある http://yugui.jp/images/uploaded/20084013-metaclass.png 右端の列にあるメタクラスと呼ばれるものになるのでしょうか? (無名クラス と メタクラスは同義??) また上記URLの画像からメタクラスはClassクラスのインスタンスであるようです。 ただClass.newで実行される newというクラスメソッドってサブクラスを生成すると いうふうにリファレンスにありますがレシーバであるClassクラスのインスタンスを 返すという記述はありません。 ただ、おそらくメタクラスというのはClassクラスのインスタンスなのだとは思いますが、 この理由はなぜなのでしょうか? もう一点、p Cattle.class();と記述すると Classクラスが返ると思います。これはCattleクラスのClassクラスのインスタンスである ということになるのでしょうか? しかしながらYUGUIさんの画像ではCattleはメタクラスのインスタンスとなっています。 であれば、メタクラスを意味するのでしょうか? 公式リファレンスには、上記に書いたような関係はRubyを扱う際には特に問題ではないとありますが、気になっています。

    • ベストアンサー
    • Ruby
  • Rubyのsuperclassメソッドについて

    Rubyについての質問です。処理系は1.8.7です。 class Foo def initialize(a) @a = a end end のようなクラスを作成し、そのインスタンスを foo = Foo.new(1) のように作成します。 このとき、 foo.superclassを呼び出すと NoMethodError: undefined method `ancestors' for #<Foo:0x2b691220cc88 @a=1> とエラーになります。 一方で class FooExt < Foo def initialize (a,b) @b = b super a end end のようにFooを継承したクラスを作り、 fooext = FooExt.new(1,2) fooext.superclass とすると => Foo とsuperclassメソッドが動作します。 このsuperclassメソッドはどこで追加されたものなのでしょうか?

  • Pythonで属性とは?

    プログラミング初心者です、よろしくおねがいします 自分でも調べたのですが初心者すぎて用語が難しく解らないところが多くはっきりしないので教えてください。 Pythonでいうオブジェクト、メソッド、属性の違いはなんですか? 私の今の所の知識では オブジェクト=クラスやメソッドやクラス変数 メソッド=クラスの中に有る関数 属性=クラスの中にある関数や変数など じゃ、オブジェクトと属性の違いってなんなの?ということに 以下の例題でA objects are given a color attribute of "white"とあります attribute=属性ですよね? つまり属性とはインスタンス変数の中身のことなの? class A(object): ....def __init__(self): ........self.color = "white" word = A() print(word.color) 有識者の方々にはくだらなすぎる疑問かも知れませんがよろしくおねがいします

  • インスタンスとオブジェクト

    こんばんは。 変数について教えて下さい。 プログラム自体が初めてなので 「たのしい Ruby 第3版」を読んでいます。 ずっとインスタンスとオブジェクトの違いが曖昧なままです。 その本の「クラスとモジュール」という章にて クラスを定義する構文。 インスタンス変数とローカル変数の違いですが、 以下の説明で一部理解できずにつまずいています。 ―――――――――――― @ で始まる変数は インスタンス変数 といいます。 ローカル変数はメソッドごとに異なる変数として扱われますが、 インスタンス変数は同じインスタンス内であれば、 メソッド定義を超えてその値を参照したり、変更したりできます。 なお、初期化されていないインスタンス変数を参照すると nil が得られます。 インスタンス変数は、インスタンスごとに違う値を持つことができます。 またインスタンス変数は、 インスタンスがある間は値を保持しておいて 何度でも利用することができます。 一方、ローカル変数はメソッド呼び出しごとに新しく割り当てられるため、 メソッドから抜けると値を忘れてしまいます。 ―――――――――――― ここで分からないのは、 ・ローカル変数が "メソッドごと" に異なる変数として扱われる ・インスタンス変数は同じ "インスタンス内" であれば、 メソッド定義を超えてその値を参照したり、変更したりできます の部分です。 Webで検索してますが、 プログラミング経験ありを前提で書かれているような。 他の言語も知らないので分からない、そんなページが多いです。 人に聞くからには 自分でも頑張って理解できるように考えますので、 どうか回答よろしくお願いします。

    • ベストアンサー
    • Ruby
  • 変数の参照でエラーが出てしまいます。(VB.NET)

    プロシージャの外に記した変数があるのですが、 (Dim IniFileName as string = "myapp.ini")など Public Shared Sub 内でIniFileNameを使おうとすると --------- クラスの明示的なインスタンスを指定しないで、共有メソッドまたは共有メンバ初期化子内からクラスのインスタンス メンバへ参照することはできません。 --------- というエラーが出てしまいます。 クラスの明示的なインスタンスを指定したいのですが、 意味がさっぱり分かりません。 class.IniFileNameとかForm1.IniFileNameなどとしてみたのですが違うようです。 一つ正解をご教示頂けたらと思います。 宜しくお願い致します。

  • PHP5 コンストラクタや初期化の意味がわからない

    プログラミング初心者です。本を参考にしてPHPを勉強しています。 クラスの章でコンストラクタについて以下のように書かれていました。 コンストラクタはインスタンス化のタイミングで実行されるという性質上、 プロパティ(メンバ変数)やクラスで使用する各種リソースの初期化 といった処理を記述するのが一般的です。 初期化処理が不要な場合、コンストラクタは省略可能。 ここで質問です。 インスタンス化を行うのは初期化するためということでしょうか? 「~といった処理を記述するのが一般的」ということは、初期化が 本来の目的ではないという意味にもとれますがどうなんでしょうか。 また静的メソッドについては、 「インスタンス化を行わなくても利用できるメソッド」 と書かれていましたが、何がどう違うのか分かりません。 初期化とは何でしょうか?またなぜ初期化を行うのでしょうか? 静的メソッドと何が違うのでしょうか?

    • ベストアンサー
    • PHP
  • Ruby インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶ

    #!/usr/bin/ruby def foo(arg) arg.upcase end def bar(arg) arg.upcase end class Foo attr_reader :foo def initialize(arg) @foo = foo(arg) #@foo = bar(arg)とすれば期待した結果が得られる end end f=Foo.new("hoge") puts f.foo 上記実行するとエラーになります。 Class Fooの中のでfooといえば、インスタンス変数@fooであって、関数のfooではないって事なのでしょうか。 インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶことはできないのでしょうか?

  • staticメソッドにするかどうかの判断

    staticメソッドの使いどころについて質問させてください。 まず、メソッドの内部で、そのメソッドが定義されているクラスのイ ンスタンス変数を使用している場合は、そのメソッドはインスタンス に依存するので、インスタンスメソッドにしかできないのはわかり ます。疑問なのは、「じゃあこのメソッド内でインスタンス変数を使 わないで引数で渡せるように作れば、インスタンスに依存しないの でstaticにしていいの?」(※)ということです。 さらにこうも思います。 なんとなくですが、※のようなことをしたらオブジェクト指向の意味 がない気がします。理由ははっきりわかりません。ほんとになんとなく です。(奇跡的にあたっていたとしても、理由を教えて下さいm(_ _)m) そして、さらに混乱するのが、ユーティリティの関数などでstaticメ ソッドになっているのを見ました。この場合はどうしてメソッドの引 数を指定するようにしていて、クラスのインスタンス変数を使うこと はしないのか。 以上、大変下手な文章ですが、混乱しているポイントが伝わったでし ょうか? よろしくお願いします。

専門家に質問してみよう