[英]How to access variables from an extended class in ruby
在大多數語言中,您可以執行以下操作:
class a {
this.property = 'prop'
}
class b extends a {
puts this.property //prints 'prop'
}
紅寶石如何工作? 我最初的想法是
class A
@property = 'prop'
end
class B < A
puts @property
end
但這是行不通的。 Ruby有self
關鍵字,但是從我的判斷看來,它似乎是為方法保留的。 類可以在ruby中繼承變量嗎?
是的,他們可以,並且下面的代碼片段演示了如何操作。
class A2
def initialize
@foo = 42
end
end
class B2 < A2
def print_foo
puts @foo
end
end
# Prints 42
B2.new.print_foo
上面的代碼定義了一個類A2
,並帶有一個定義並設置實例變量@foo
。 B2
類擴展了A2
,並定義了一個使用@foo
的方法。
我認為您的代碼存在的問題是@property
沒有分配值,因為分配沒有在任何時候被調用的方法中。
是。 您需要在initialize
方法中初始化實例變量。
看一個例子:
class A
attr_accessor :property
def initialize
self.property = 'prop'
end
end
class B < A
end
puts B.new.property # prints "prop"
開頭的變量@
印記是實例變量 。 它們屬於特定實例(即“對象”)。
您的代碼中有兩個對象,一個對象是A
類,第二個對象是B
類。 這兩個對象中的每一個都有其自己的實例變量。
A
有一個名為@property
的實例變量,其值是'prop'
。 B
沒有實例變量,但是,未初始化的實例變量的值為nil
而不是引發異常,因此,您不會收到錯誤,但其值為nil
。
你不能繼承變量。 在Ruby中唯一可以繼承的是方法:
class A
def self.property
'prop'
end
end
class B < A
puts property
end
# prop
Ruby還具有以@@
sigil開頭的類變量。 這些在整個類層次結構中共享:
class A
@@property= 'prop'
end
class B < A
puts @@property
end
# prop
但是,類變量幾乎從未在Ruby中使用,因為它們的作用域很廣,就像全局變量一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.