2017-05-28 111 views
1

說明性示例

在文件b.rb中,我有以下兩個類:Dog和Cat。爲什麼紅寶石'要求'不是更細粒度?

在Ruby中,使用在文件b.rb定義的類犬,我有權要求b.rb:

require 'b' 

puts Dog.new.bark 

但是,即使我並不需要有貓,它被定義因爲所需文件中的所有類都已加載。

問題

所以我的問題是:爲什麼沒有在Ruby中,要求的文件只有部分的方法嗎?

有沒有理由認爲它在Ruby中不被認爲是必要的,或者它是否包含在語言未來的某些路線圖中?

在蟒蛇他們有from module import MyClass形式,它可以讓導入文件選擇要導入的內容,並在世界上的NodeJS他們有module.export,這讓導入文件選擇什麼樣的出口。

在我看來,Python和NodeJS在這方面更加靈活。在紅寶石的選擇中進行權衡是什麼?

附加問題:如何調用python/nodeJS機制(選擇性導入?)?

+2

這就是'require'在Ruby中的工作方式。 就我個人而言,我只是在dog.rb中放入'Dog'類,並在cat.rb中放入'Cat'。這是非常直觀的,並鼓勵文件不要變得凌亂。 – progfan

+0

我認爲在一個文件中有多個類是絕大多數時候是不好的做法 - 或者至少不遵循常見的Ruby約定。 – spickermann

+1

這只是一種不同的哲學。 Python包往往有幾個腳本,裏面有很多類。 Ruby寶石往往有許多腳本,每個腳本最多隻有一個類。與Ruby相比,Python的動態性更強,更加明確,因此文本編輯器和IDE可以更輕鬆地分析Python代碼。在Python定義的任何地方跳過類定義更容易。使用Ruby,可以有很多動態類和方法定義,以至於文本編輯器需要知道基礎約定。 –

回答

3

這就是require的工作原理:require運行該文件。而已。除此之外,它什麼也做不了。

如果你想添加一個模塊系統到Ruby,這將是一個巨大的變化,以Ruby的工作方式。

只是不要在同一個文件中定義不相關的類。

+1

*「require運行文件,就是這樣,它不會做任何其他的事情。」* - 不是**完全正確。很少使用的'load'會盲目運行文件;如果文件尚未運行,'require'只運行該文件。 –

+1

另外,對於它的價值,Ruby的'require'行爲類似於C的'include'(而MRI是用'C'寫成的)。所以如果我們在談論「爲什麼ruby的行爲是這樣的?」,那麼這裏的一個可能的答案是它模仿了它被寫入的語言。 –

+0

不,'require' *不*類似於#include。 'require'運行該文件。 '#include'在詞彙上替代文件內容而不是'#include'指令。這完全和完全不同。例如,一個'#include'd文件甚至不需要在語法上是有效的。你可以「包含」一個包含語句開頭的文件和另一個包含該語句結尾的文件。或者你可以把一個子表達式包含到一個更大的函數中。 –

0

除了Jörgs answer:您可能會在Ruby中使用模塊。

一個例子。你b.rb樣子:

module Cats 
    class Cat 
    def meouw 
     puts 'meouw' 
    end 
    end 

end 

module Dogs 
    class Dog 
    def bark 
     puts 'wuff wuff' 
    end 
    end 
end 

您的腳本看起來像:

require_relative 'b' 

include Dogs 
puts Dogs::Dog.new.bark #->wuff wuff 
puts Dog.new.bark #->wuff wuff 

puts Cats::Cat.new.meouw #-> meouw 
puts Cat.new.meouw #-> Exception uninitialized constant Cat (NameError) 

具體會發生什麼:

require_relative 'b' 

您讀取該文件。這將執行文件b.rb(它定義了類)中的所有內容。

include Dogs 

不,您將模塊Dogs加載到實際範圍內。類Dog現在可用。

puts Dogs::Dog.new.bark #->wuff wuff 
puts Dog.new.bark #->wuff wuff 

可以使用類Dog在模塊Dogs的範圍或者你可以用它直接。

puts Cats::Cat.new.meouw #-> meouw 

您還加載了類Cats::Cat,您可以使用它。

puts Cat.new.meouw #-> Exception uninitialized constant Cat (NameError) 

Cat是不是在全球範圍內(你從來沒有一個import Cats),所以你得到一個異常。

最後一個警告:b.rb的定義是錯誤的編碼。通常你創建一個dog.rb和一個cat.rb。你可以要求獨立的類。