【问题标题】:Ruby: How to pass the object name to an array rather than the IDRuby:如何将对象名称传递给数组而不是 ID
【发布时间】:2015-05-25 16:26:13
【问题描述】:

如果我像这样创建两个对象:

foo = foo.new
bar = bar.new

并且想将对象 foo 的名称存储在 bar 中的数组中,我该怎么做?

例如,如果我将 foo 传递给 bar 中的以下方法:

def to_array arg
  fooarray << arg
end

我怎样才能得到它,以便方法 'to_array' 将名称 'foo' 存储在数组中,而不是对象的实例 ID?

所以数组看起来像这样:

['foo', 'foo2', 'foo3' etc..]

而不是

[#<foo:0x00..., #foo2:0x00..., etc..]

我真的希望这是有道理的。我是 Ruby 新手,所以我可能不太清楚。

【问题讨论】:

  • 也许以此为基础?:stackoverflow.com/questions/826210/…
  • 你为什么想要这些名字?如果你有a = A.new; b = a,你会想要什么?想要做这种事情的人通常表示对象和变量之间存在一些混淆,或者他们试图做一些奇怪的事情。
  • 对象的“名称”是什么?对象在 Ruby 中没有名称。它们有身份、状态和类别,但没有名字。

标签: ruby arrays


【解决方案1】:

要获取对象类的名称,可以使用class 方法。像这样:

fooOne = Foo.new
fooOne.class.to_s # returns the string 'Foo'

您可以在 Foo 上定义一个 type 方法来简化此操作。至于在将 foo 对象放入数组时返回此值,我同意其他发帖者的观点,即map 是更好的选择。

【讨论】:

    【解决方案2】:

    我猜你只是想保留一个变量名数组?或者'name'是foo的一个属性。如果是前者,为什么不保留一个在创建对象时附加到的运行数组,即 arg 将是变量名而不是对象。如果是后者,'name' 是 foo 的一个方法,那么你总是可以在对象数组上使用 map:

    bar =  [#<foo:0x00..., #foo2:0x00..., etc..].map(&:name)
    
    > ['foo', 'foo1',..., 'fooN']
    

    def to_array arg
      fooarray << arg.name
    end
    

    【讨论】:

    • 你是对的!我不想将 ID 存储在数组中,而是存储实例的变量名。提到方法“名称”时,您是什么意思?
    • 如果 foo 是一个对象,那么它将有方法。其中一种方法可能是“名称”。
    【解决方案3】:

    也许改用哈希?根据您拥有的数量一次添加所有对象可能会有点痛苦,但回报是它会给您(我认为)您想要的东西,甚至可能更多......以防万一不熟悉哈希(你说你是新人)这是你的做法:

    创建散列,我将我的散列称为“变量”

    variables = {}
    

    将项目添加到哈希使用:hash_name['key_name'] = 'value'。

    variables['var1'] = 'something1'
    variables['var2'] = 'something2'
    variables['var3'] = 'something3'
    

    如果你有一个看起来像这样的变量:

    foo = 'foobar' 
    #then 'foo' would be the key_name and 'foobar' would be the value.
    

    创建哈希后,查看整个哈希,包括键和值:

    puts variables
    #=> {"var1"=>"something1", "var2"=>"something2", "var3"=>"something3"} 
    

    只看键:

    puts variables.keys
    # => var1 
    # => var2
    # => var3
    

    只看值:

    puts variables.values
    # => something1
    # => something2
    # => something3
    

    查看一个特定键中的内容:

    puts variables['var3']
    # => something3
    

    如果您出于某种原因需要一个仅包含您的键(对象)名称的数组,您可以通过创建一个数组并将所有键一次推入其中轻松地做到这一点:

    all_vars_array = []
    all_vars_array << variables.keys #pushes ALL the keys of your hash into your array.
    
    puts all_vars_array
    # => ['var1', 'var2', 'var3']
    

    所以你看,构建一个哈希值可能是值得的,这取决于你在做什么。

    【讨论】:

      猜你喜欢
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多