3

次のコードは何も出力しませんwelcomeBack。説明してください。

class Hello

  @instanceHello = "welcomeBack"

  def printHello
    print(@instanceHello)
  end

  Hello.new().printHello();
end

ルビーを習い始めたばかりなので、質問がばかげているように見える場合はご容赦ください。

4

4 に答える 4

7

メソッドの定義と変数の設定について 1 つだけ覚えることができるとすれば、それは次のことです: 常に自分自身にself問いかけてみてください。

class Hello
  # This ivar belongs to Hello class object, not instance of Hello.
  # `self` is Hello class object.
  @instanceHello = "welcomeBack" 

  def printHello
    # Hello#@instanceHello hasn't been assigned a value. It's nil at this point.
    # `self` is an instance of Hello class
    print @instanceHello
  end

  def self.printSelfHello
    # Now this is Hello.@instanceHello. This is the var that you assigned value to.
    # `self` is Hello class object
    print @instanceHello
  end

end

Hello.new.printHello # >> 
Hello.printSelfHello # >> welcomeBack

ivar のデフォルト値を設定する場合は、コンストラクターで行います。

class Hello

  def initialize
    @instanceHello = "welcomeBack"
  end

  def printHello
    print @instanceHello
  end
end

Hello.new.printHello # >> welcomeBack
于 2012-12-25T18:27:14.963 に答える
3

Ruby ではインスタンス変数を定義し、インスタンス メソッドで使用します。initializeしたがって、割り当てをメソッドに入れる必要があります。

class Hello

  def initialize
    @instanceHello = "welcomeBack"
  end

  def printHello
    print(@instanceHello)
  end

end

Hello.new.printHello();

また、printHello 呼び出しをクラス定義の外に移動したことにも注意してください。これは、クラスが最初に閉じられるまで実際には定義されないためです。つまり、最後のend.

于 2012-12-25T18:40:43.327 に答える
0

@instanceHello を self.class.instance_variable_get(:@instanceHello) に変更します

@instanceHello はクラス インスタンス バリアントです

コードはこれです:

    class Hello
            @instanceHello = "welcomeBack"
            @@classHello = "greeting!"
            def printHello
                    print(self.class.instance_variable_get(:@instanceHello))
                    print(self.class.class_variable_get(:@@classHello))
            end
    end
    Hello.new().printHello();
于 2012-12-28T06:25:44.663 に答える
0
class Hello

  @instanceHello = "welcomeBack"

  def printHello
      puts self.class.instance_variable_get(:@instanceHello)
  end

  Hello.new.printHello; #=> welcomeBack
end

これは良いプログラミングではありませんが、他のインスタンスと同様に、クラス (クラス Class のインスタンス) もインスタンス変数を持つことができることを説明するためのものです。これらは「クラス インスタンス変数」と呼ばれ、クラス変数よりも優先されます。次の例は、クラス レベルでカウンターを定義する方法を示しています。

class Hello
  @counter = 0

  class << self # access methods for class instance variables must be
                # defined in the singleton class
      attr_accessor :counter
  end

  def printHello
      self.class.counter += 1
      puts "Hello #{self.class.counter}"
  end
end

Hello.new.printHello; #=> Hello 1
Hello.new.printHello; #=> Hello 2
p Hello.singleton_methods #=> ["counter=", "counter"]
于 2012-12-26T06:31:47.533 に答える