我正在尝试使这个简单的方法返回与其输入名称相关的值。例如,如果我给方法“people_array”,它应该返回“people_array_of_arrays。”
如果我在IRB中使用该方法,我会得到类似的结果:
people_array = ["George\tMichael", "Kim\tKardashian", "Kanyne\tWest"]
=> ["George\tMichael", "Kim\tKardashian", "Kanyne\tWest"]
make_array_of_arrays(people_array)
=> people_array_of_arrays
people_array
=> ["George\tMichael", "Kim\tKardashian", "Kanyne\tWest"]
people_array_of_arrays
=> [["George", "Micahel"], ["Kim", "Kardashian"], ["Kayne", "West"]]
到目前为止,我已经编写了这个,但是还没弄清楚如何返回一个名称很好的数组。我能想到的只是字符串插值,但这并不是我需要的。
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
我看到有一个方法varblize,但是它返回的实例变量并不是我想要的。有什么指针吗?
答案 0 :(得分:3)
我认为不容易做到。假设您能够在方法定义中以某种方式定义局部变量。但该局部变量的范围仅限于方法定义。因此,当您离开方法定义时,局部变量名称就消失了。因此,为了做到这一点,您必须以某种方式获取方法定义之外的环境的binding
信息,并在其中定义局部变量。我不知道这是否可能。
使用实例变量,使用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也可能有用。
答案 1 :(得分: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
答案 2 :(得分:2)
这里的一个大问题是没有好的方法来访问变量的名称。
除此之外,在Sean Vieira的补充下,你可以做一些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行创建了一个函数,它返回你正在寻找的数组。
如果您能找到获取变量名称的方法,那么您就拥有了所需的一切。 不是说我真正支持这种方法。我不能为我的生活弄清楚你为什么要这样做。这是非常单一的,并且对于那些看着那块代码的人来说会让人感到困惑。
答案 3 :(得分:0)
这不容易也不明智。
将Ruby Objects视为人(您和我)通过电话进行通信(phonenumbers为object_id)。想象一下,我在你的名字(变量)'sTeEnSlAg'下的phonenumbers列表中,也在'steenslg'下。然后你给我打电话询问“请告诉我你在我手机上注册的名字,后用”_of_arrays“修复。
您认为我的答案有礼貌的版本是什么?