3

我试图让这个简单的方法返回一个与其输入名称相关的值。例如,如果我给方法“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

我看到有一个方法 variablize,但它返回的实例变量并不是我想要的。任何指针?

4

4 回答 4

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"]]


也可能有用。

于 2012-10-26T21:37:05.077 回答
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 行创建了一个函数,该函数返回您正在寻找的数组。

如果您能找到一种方法来获取变量的名称,那么您将拥有所需的一切。并不是说我真的正式认可这种方法。我一辈子都想不通你为什么要这么做。这是非常单一的,并且对于查看该代码块的任何人都会感到困惑。

于 2012-10-26T21:58:43.373 回答
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
于 2012-10-26T21:16:07.190 回答
0

这既不容易也不可取。

将 Ruby 对象想象成人们(你和我)通过电话进行交流(电话号码是 object_id)。想象一下,我在名称(变量)“sTeEnSlAg”以及“steenslg”下的电话号码列表中。然后你给我打电话问“请给我你在我手机上注册的名字,后缀为“_of_arrays”。

你认为我回答的礼貌版本是什么?

于 2012-10-26T22:05:26.590 回答