2012-10-26 140 views
3

我試圖讓這個簡單的方法返回一個與其輸入名稱相關的值。例如,如果我給「people_array」方法,它應該返回「people_array_of_arrays」。在返回值變量名稱中使用輸入名稱

如果我使用IRB我會得到什麼樣的方法:

​​

到目前爲止,我已經寫了這一點,但一直無法弄清楚如何返回數組的一個很好的命名的數組。我能想到的只是字符串插值,但這不完全是我需要的。

def make_array_of_arrays(array) 
    formatted_array = [] 
    array.each do |feed| 
     mini_array = feed.split("\t") 
     formatted_array.push(mini_array) 
    end 
    #{array}_of_arrays = formatted_array 
end 

我看到有一個方法可變化,但是它返回的實例變量並不完全是我想要的。任何指針?

+1

好,我們在你的問題的第二部分有'map'方法,但我仍然不明白你的問題是什麼?你想設置實例變量,比如'@Kardashian ='Kim'' ? –

+0

爲什麼你想這樣做? –

回答

3

我不認爲這可以輕鬆完成。假設你能夠在方法定義中以某種方式定義一個局部變量。但該局部變量的範圍僅限於方法定義。所以,當你走出方法定義之外,局部變量名稱就消失了。所以爲了做到這一點,你必須以某種方式獲得方法定義之外的環境信息,並在其中定義一個局部變量。我不知道這是否可能。

使用實例變量,使用instance_variable_set可以使事情變得更容易,但我不確定如何完全實現它。首先,獲取原始變量的名字很棘手。

而你所要做的並不是正確的做法。你應該想到不同的方式。


我認爲你能做的最好是使用實例變量,而不是一個局部變量,並且也給變量的名稱明確,而不是該數組本身:

def make_array_of_arrays(variable_name) 
    array = instance_variable_get("@#{variable_name}") 
    # Your code here 
    instance_variable_set("@#{variable_name}_of_arrays", formatted_array) 
end 

@people_array = ["George\tMichael", "Kim\tKardashian", "Kanyne\tWest"] 
make_array_of_arrays(:people_array) 
@people_array_of_arrays 
#=> [["George", "Micahel"], ["Kim", "Kardashian"], ["Kayne", "West"]] 


This也可能有用。

+0

這樣做的一種方法是使用正則表達式魔法,例如'/(?)\ t(?)/ =〜'Kim \ tKardashian'',它應該設置'given_name'和'surname'局部變量,但當然,這不是來自方法調用。 –

+0

@BorisStitnicky OP不想將變量的名字設置爲'given_name'或'surname'。 – sawa

2

不需要元編程(除非我誤解了你的問題)。只要你把你格式化數組:

def make_array_of_arrays(array) 
    formatted_array = [] 
    array.each do |feed| 
     mini_array = feed.split("\t") 
     formatted_array.push(mini_array) 
    end 
    formatted_array 
end 

然後,你可以指定返回值,任何你想要的名稱:

people_array_of_arrays = make_array_of_arrays(people_array) 

注意,您可以使用map簡化您的make_array_of_arrays方法:

def make_array_of_arrays(array) 
    array.map do |feed| 
     feed.split("\t") 
    end 
end 
+0

:)))這件事明顯可以回答嗎? –

+0

好的,爲#map代碼段投票 –

+0

這是缺少問題的全部內容 – sawa

2

這裏最大的問題是沒有好的方法來訪問變量的名稱。

除非是和建築肖恩維埃拉此外,你可以做一些EVAL魔術得到這樣的:

def make_array_of_arrays(array, array_name) 
    new_array = array.map { |feed| feed.split("\t") } 

    eval("def #{array_name}_of_arrays; return #{new_array}; end") 
end 

這基本上將爲您的* _of_arrays線返回你正在尋找的陣列功能。

如果您可以找到一種方法來獲取變量的名稱,您將擁有所需的一切。 不是我真正正式認可這種方法。我不能爲了我的生活找出你爲什麼想這樣做。這是非常單一的,並且會讓看到這段代碼的人感到困惑。

+0

我剛剛意識到你也可以用一些更多的eval魔法和Kernel.binding方法來獲得變量的名稱。但是,你真的很難過。 –

0

這不容易也不可取。

將Ruby對象想象爲通過電話進行通信的人(您和我)(電話號碼是object_id的)。想象一下,我在名稱(變量)的'TeEnSlAg'下,並且在'steenslg'下面的電話號碼列表中。然後,你打電話給我,問:「請給我你是在我的手機上註冊的名稱,固定後用‘_of_arrays’。

你覺得會是我的回答禮貌版本?