2013-08-02 35 views
0

我怎麼可能只是一個命名空間下訪問各法克爾方法:混合在法克爾方法 - RSpec的

any.sentence 
any.name 
... other methods from Faker::xxx classes 

書寫相反的:

Faker::Lorem.sentence 
Faker::Name.name 
... 

我使用的RSpec和Rails。

回答

1

爲了做到這一點,你可以定義你的變量any這等於命名空間的類,你要撥打:

lorem = Faker::Lorem 
lorem.sentence 
#=> "Dignissimos eos qui doloribus quaerat sequi est corrupti error." 

name = Faker::Name 
name.name 
#=> "Dr. Percival Ernser" 

但請,認爲這是一個黑客,而不是你應該做的在你的代碼中。事實上,當有人會閱讀你的代碼(或者你在幾個月內),看到Faker::Namespace將顯得很明顯。另一方面,讀name.name會導致混亂,你將不得不尋找它的定義來理解它的作用。命名空間有一個存在的理由,不應該被覆蓋,以節省一些擊鍵。 希望這回答你的問題!

編輯:從你評論「統一所有命名空間到一個」。這是不可能的(至少對於Faker)。事實上,不同的方法具有相同的名稱,但在不同的名稱空間中。例如,Faker具有在Faker::NameFaker::Company(其產生不同結果)中的方法name的實現。

因此,統一命名空間是不可能的,因爲它會導致丟失一些方法。

+0

我雖然有一個命名空間不會導致混淆,因爲我可以稱之爲統一命名空間「faker」。但是你的擔心似乎非常有效。關於這個問題,我在問如何將所有的命名空間統一成一個類似於這個僞代碼的東西:'Faker.classes.each do | c | c.methods.each do | m | faker.m = m end end' – juanpastas

+0

好的,不要使用'Faker.classes',你應該使用'Faker.constants'。但是這裏有兩個陷阱:你會得到像'Config'或'Version'這樣的東西。但更重要的是,您打算如何區分'Faker :: Company.name'和'Faker :: Name.name'? – mdemolin

+0

嗯,它更復雜,但它是可能的。 'faker.name'會產生一個名字,那麼當第二次定義'name'時,它就是'faker.company_name'。好吧,我想這太複雜了,我會把你的標記作爲答案。 – juanpastas