0
我怎麼可能只是一個命名空間下訪問各法克爾方法:混合在法克爾方法 - RSpec的
any.sentence
any.name
... other methods from Faker::xxx classes
書寫相反的:
Faker::Lorem.sentence
Faker::Name.name
...
我使用的RSpec和Rails。
我怎麼可能只是一個命名空間下訪問各法克爾方法:混合在法克爾方法 - RSpec的
any.sentence
any.name
... other methods from Faker::xxx classes
書寫相反的:
Faker::Lorem.sentence
Faker::Name.name
...
我使用的RSpec和Rails。
爲了做到這一點,你可以定義你的變量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::Name
和Faker::Company
(其產生不同結果)中的方法name
的實現。
因此,統一命名空間是不可能的,因爲它會導致丟失一些方法。
我雖然有一個命名空間不會導致混淆,因爲我可以稱之爲統一命名空間「faker」。但是你的擔心似乎非常有效。關於這個問題,我在問如何將所有的命名空間統一成一個類似於這個僞代碼的東西:'Faker.classes.each do | c | c.methods.each do | m | faker.m = m end end' – juanpastas
好的,不要使用'Faker.classes',你應該使用'Faker.constants'。但是這裏有兩個陷阱:你會得到像'Config'或'Version'這樣的東西。但更重要的是,您打算如何區分'Faker :: Company.name'和'Faker :: Name.name'? – mdemolin
嗯,它更復雜,但它是可能的。 'faker.name'會產生一個名字,那麼當第二次定義'name'時,它就是'faker.company_name'。好吧,我想這太複雜了,我會把你的標記作爲答案。 – juanpastas