簡體   English   中英

如何從Ruby中的擴展類訪問變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM