在返回值变量名称中使用输入名称

时间:2012-10-26 21:05:24

标签: ruby

我正在尝试使这个简单的方法返回与其输入名称相关的值。例如,如果我给方法“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,但是它返回的实例变量并不是我想要的。有什么指针吗?

4 个答案:

答案 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“修复。

您认为我的答案有礼貌的版本是什么?