【问题标题】:How to replace a string param with an array in Ruby?如何用Ruby中的数组替换字符串参数?
【发布时间】:2017-07-14 15:31:40
【问题描述】:

如何在 Ruby 中执行以下操作?

由于传递值参数,它无法按预期工作。

def validate! msg
  if msg.is_a?(String)
    msg = [ msg ]
  end
end

#replace 可以在 msg 被替换为另一个字符串时使用。

【问题讨论】:

  • How to do the following in Ruby? 是什么意思?那不是已经是 ruby​​ 代码了吗?
  • @emaillenin - 我的意思是msg 没有更新。我编辑了问题。
  • 解释你想要完成的事情。这听起来有点像您试图将 msg into 变成一个数组。如果是这样,那么这是不可能的。有一些对象的方法可以改变对象,但即使在这些情况下,您也不能将对象“改变”为不同的类。正确的做法是只使用一个新变量并将其设置为等于[msg]。用方法做到这一点很好。此外,String 需要大写,否则将无法运行。
  • 返回msg并在调用者代码中更新

标签: ruby parameters parameter-passing ruby-2.3


【解决方案1】:

正如另一个答案所指出的,您不能将字符串原地变异为数组。
您可以使用定义的方法重置指针。但实际上你可以使用#Array 做得更好:

msg = 'string'
msg = Array(msg)
#=> msg = ['string']

msg = ['array']
msg = Array(msg)
#=> msg = ['array']

【讨论】:

    【解决方案2】:

    虽然某些类具有允许您改变对象的实例方法,但您不能将一个对象改变为另一个类。在这种情况下,您不能将 String 对象变为 Array 对象。

    如你所愿,你的代码将返回[msg] 如果消息是一个字符串。否则它将返回零。要使该方法始终返回一个数组,您可以像这样使用三元组:

    def validate! msg
      msg.is_a?(String) ? [msg] : msg
    end
    
    # ...
    
    my_msg = "message"
    my_validated_message = validate!(my_msg) # => ["message"]
    
    my_already_valid_message = ["different message"]
    my_revalidated_message = validate!(my_already_valid_message) # => ["different message"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-24
      • 2014-07-25
      • 2013-11-08
      • 2015-04-11
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多