我想知道在Ruby中聲明之前是否可以使用變量和方法。有沒有像JavaScript中的提升?是否有類似JavaScript的JavaScript在Ruby中升起?
def calcArea
getWidth * getHeight
end
def getWidth
@w
end
def getHeight
@h
end
@w = 10
@h = 20
p calcArea
我想知道在Ruby中聲明之前是否可以使用變量和方法。有沒有像JavaScript中的提升?是否有類似JavaScript的JavaScript在Ruby中升起?
def calcArea
getWidth * getHeight
end
def getWidth
@w
end
def getHeight
@h
end
@w = 10
@h = 20
p calcArea
我想知道是否可以在Ruby中聲明之前使用變量和方法。
變量不需要在Ruby中聲明,這樣問題的一部分就沒有意義了。變量在首次分配時出現,或者在局部變量的情況下,第一次分配的變量爲,分解爲。
方法是定義爲,未聲明。方法定義就像任何其他代碼一樣是一段代碼。它需要執行才能生效。你不能調用一個不存在的方法,並且一個方法只有在它的定義執行後才存在。
有沒有像JavaScript中的提升?
號
def calcArea getWidth * getHeight end def getWidth @w end def getHeight @h end @w = 10 @h = 20 p calcArea
這工作得很好,但它無關吊裝。定義完成後,您只需撥打calcArea
即可,所以完全可以。 calcArea
來電getWidth
和getHeight
,但只有當calcArea
本身被調用,這是所有方法已被定義,所以沒關係。 getWidth
和getHeight
訪問@w
和@h
,但是再次,在調用getWidth
和getHeight
時,@w
和@h
已被分配,所以也可以。 (並且即使他們還沒有分配,訪問它們仍然不是錯誤,訪問不存在的實例變量的計算結果僅爲nil
;顯然,您將獲得NoMethodError
來嘗試調用nil
上的*
,但這與爲一個不存在的變量獲取NameError
非常不同。)
上的編碼風格的一些注意事項:
snake_case
的方法,參數,局部變量,實例變量,類變量和全局變量。get
。calcArea
基本上是該地區的吸氣劑,所以也應該命名爲不帶前綴。因此,根據Ruby社區的風格,你的代碼應該是這樣的:
def area
width * height
end
def width
@width
end
def height
@height
end
@width = 10
@height = 20
p area
如果這是一個模塊或類定義的一部分,那麼你可以使用attr_reader
自動生成的干將和attr_writer
來生成setter:
class Rectangle
attr_reader :width, :height
def area
width * height
end
private
attr_writer :width, :height
def initialize(width, height)
self.width, self.height = width, height
end
end
rect = Rectangle.new(10, 20)
p rect.area
感謝您的詳細解釋。這使我的概念清晰。 – PJCHENder
你的例子在Ruby中工作得很好。
在JavaScript中,提升意味着Javascript將您的變量聲明移動到當前作用域的頂部。根據這個article,Ruby也做了某種提升。然而,如果它與Javascript的相同(見評論),這是值得商榷的。
另一個原因您的例子大概要工作的變量@w
和@h
是nil
除非沒有定義,因爲你已經調用前calcArea
定義他們,他們有他們的實際值。
在Ruby的頂級定義方法和實例變量會模糊變量作用域。將所有內容都包裝在適當的類中可能會更清潔。 – Stefan