次のコードは何も出力しませんwelcomeBack
。説明してください。
class Hello
@instanceHello = "welcomeBack"
def printHello
print(@instanceHello)
end
Hello.new().printHello();
end
ルビーを習い始めたばかりなので、質問がばかげているように見える場合はご容赦ください。
次のコードは何も出力しませんwelcomeBack
。説明してください。
class Hello
@instanceHello = "welcomeBack"
def printHello
print(@instanceHello)
end
Hello.new().printHello();
end
ルビーを習い始めたばかりなので、質問がばかげているように見える場合はご容赦ください。
メソッドの定義と変数の設定について 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
Ruby ではインスタンス変数を定義し、インスタンス メソッドで使用します。initialize
したがって、割り当てをメソッドに入れる必要があります。
class Hello
def initialize
@instanceHello = "welcomeBack"
end
def printHello
print(@instanceHello)
end
end
Hello.new.printHello();
また、printHello 呼び出しをクラス定義の外に移動したことにも注意してください。これは、クラスが最初に閉じられるまで実際には定義されないためです。つまり、最後のend
.
@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();
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"]