2012-10-26 141 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’。

你觉得会是我的回答礼貌版本?