2016-10-23 91 views
4

有沒有更好的方式來獲得類/模塊的名稱即,CA::B::CBA::B::C,和AA::B::C。下面的代碼使用字符串和拆分從Cowsay::Character::Stegosaurus得到"Stegosaurus",如何消除字符串和拆分?獲取類/模塊名

require 'cowsay' 
x = Cowsay.random_character().class 
x.name.split("::")[2] 
require 'cowsay' 
true 
x = Cowsay.random_character().class 
Cowsay::Character::Stegosaurus 
x.name.split("::")[2] 
"Stegosaurus" 

感謝

+0

我的理解是正確的,您希望提取每個元素而不將'A :: B :: C'轉換爲字符串?請注意,在這個例子中'A'是一個模塊,但'B'和'C'不是模塊,甚至沒有Ruby對象,所以你可以做的最好的是'A'或''A'',''B 「'和'」C「'。既然你總是以字符串結束,爲什麼避免將'A :: B :: C'轉換爲一個字符串,因爲你有一個非常簡單的方法來做到這一點? –

+0

如果我在上面的評論中不清楚,'A :: B :: C'告訴我們有三個嵌套模塊,'A','A :: B'和'A :: B :: C'。 'B'和'C'不是模塊。如果你定義了模塊'A :: C'和'B :: C',那麼引用模塊'C'意味着什麼? –

+2

IMO'split(「::」)[2]'並不是那麼糟糕。當然不像要求主動支持那麼糟糕。這很簡單,完成這項工作。 – Max

回答

4

我不認爲有什麼在覈心/標準庫處理這個。

作爲替代定製編寫的方法總是有activesupport

require 'active_support/core_ext/string/inflections' 
Cowsay::Character::Stegosaurus.name.demodulize 
#=> "Stegosaurus" 
Cowsay::Character::Stegosaurus.name.deconstantize 
#=> "Cowsay::Character" 

這些方法如下實施:

def demodulize(path) 
    path = path.to_s 
    if i = path.rindex('::') 
    path[(i+2)..-1] 
    else 
    path 
    end 
end 

def deconstantize(path) 
    path.to_s[0, path.rindex('::') || 0] # implementation based on the one in facets' Module#spacename 
end 

如果想了解更多的方法看看into docs

至於

AA::B::C

如果您想require整個activesupport,你會得到一堆Module方法,包括parent

require 'active_support' 
Cowsay::Character::Stegosaurus.parent 
#=> Cowsay 

如果你不會廣泛使用它,我建議只抓住n從activesupport eeded方法並將其放入一些幫助,因爲加載它可能是一個矯枉過正。

+2

如果您需要提取有用方法的好處。這對於開源來說是非常棒的:如果你需要它們,你總是可以借用部件。 – tadman