2017-02-15 80 views
2

我想知道在Ruby中聲明之前是否可以使用變量和方法。有沒有像JavaScript中的提升?是否有類似JavaScript的JavaScript在Ruby中升起?

def calcArea 
    getWidth * getHeight 
end 

def getWidth 
    @w 
end 
def getHeight 
    @h 
end 
@w = 10 
@h = 20 

p calcArea 
+0

在Ruby的頂級定義方法和實例變量會模糊變量作用域。將所有內容都包裝在適當的類中可能會更清潔。 – Stefan

回答

5

我想知道是否可以在Ruby中聲明之前使用變量和方法。

變量不需要在Ruby中聲明,這樣問題的一部分就沒有意義了。變量在首次分配時出現,或者在局部變量的情況下,第一次分配的變量爲,分解爲

方法是定義爲,未聲明。方法定義就像任何其他代碼一樣是一段代碼。它需要執行才能生效。你不能調用一個不存在的方法,並且一個方法只有在它的定義執行後才存在。

有沒有像JavaScript中的提升?

def calcArea 
    getWidth * getHeight 
end 

def getWidth 
    @w 
end 
def getHeight 
    @h 
end 
@w = 10 
@h = 20 

p calcArea 

這工作得很好,但它無關吊裝。定義完成後,您只需撥打calcArea即可,所以完全可以。 calcArea來電getWidthgetHeight,但只有當calcArea本身被調用,這是所有方法已被定義,所以沒關係。 getWidthgetHeight訪問@w@h,但是再次,在調用getWidthgetHeight時,@w@h已被分配,所以也可以。 (並且即使他們還沒有分配,訪問它們仍然不是錯誤,訪問不存在的實例變量的計算結果僅爲nil;顯然,您將獲得NoMethodError來嘗試調用nil上的*,但這與爲一個不存在的變量獲取NameError非常不同。)

上的編碼風格的一些注意事項:

  • 紅寶石使用snake_case的方法,參數,局部變量,實例變量,類變量和全局變量。
  • Ruby不會爲getter使用前綴get
  • 平凡的getter應該與實例變量命名相同。
  • 此外,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 
+0

感謝您的詳細解釋。這使我的概念清晰。 – PJCHENder

1

你的例子在Ruby中工作得很好。

在JavaScript中,提升意味着Javascript將您的變量聲明移動到當前作用域的頂部。根據這個article,Ruby也做了某種提升。然而,如果它與Javascript的相同(見評論),這是值得商榷的。

另一個原因您的例子大概要工作的變量@w@hnil除非沒有定義,因爲你已經調用calcArea定義他們,他們有他們的實際值。

+0

我不認爲這是真的。用簡單的打印代替'binding.pry'調用,你會得到一個錯誤。 – ndn

+0

也許這是'pry'的一個特點?我不知道,我沒有寫這篇文章 - 只是我發現的東西。現在你提到它,它看起來很奇怪,Ruby會掛起。 – Coolness

+0

發現另一篇文章,支持存在的提升:http://ieftimov.com/variable-hoisting-ruby 「基本上,當解析器運行if-子句(查看weird_3.rb示例文件)它首先聲明這個變量,不管它是否會被實際執行。「 – Coolness

相關問題