【问题标题】:How to iterate if object can be string or array如果对象可以是字符串或数组,如何迭代
【发布时间】:2016-06-03 05:55:38
【问题描述】:

我在 Rails 模型中有一个对象,它可以是字符串或数组。在我看来,我有以下几点:

<% current_user.transaction[:account_name].each do |name| %>

如果对象account_name是一个字符串,那么它会抛出一个错误。

我想运行这样的东西:

<% current_user.transaction[:account_name].each, if sting? each_line do |name| %>

如果对象是字符串则使用each_line,如果是数组则使用each。我不确定这是否是最好的解决方案。无论对象是数组还是字符串,有什么方法可以使它工作?

【问题讨论】:

  • 能否请您完全阻止,以便我修改代码
  • “我有一个对象 [...] 可以是字符串或数组” 是您应该解决的问题.

标签: arrays ruby string


【解决方案1】:

您可以使用 splat 运算符。例如:

str = "hello"
arr = ["hi"]

[*str]
# => ["hello"] 
[*arr]
# => ["hi"]

所以你的代码变成了

[*current_user.transaction[:account_name]].each do |name|

【讨论】:

  • 酷我以前不知道这种语法
  • 请注意 * 在后台调用 to_a 如果您的对象实现自定义 to_a 可能会产生不希望的结果,例如[*Time.now]
【解决方案2】:
<% Array(current_user.transaction[:account_name]).each do |name| %>
   balaballa
<% end %>

注意Array(element)如果传入一个数组就什么都不做,如果不是数组就尝试用数组转换元素。

如果元素为 nil,那么它只会返回 [],并且不会循环任何内容。

【讨论】:

  • 如果数组为空怎么办?
  • @DineshSaini: Array(nil) = []
  • @DineshSaini: 因为 Array(nil) 给你一个空数组,它会是[].each
  • 正确我们必须在循环中处理 nil ,对吗? (为你 +1)
  • @DineshSaini:不。如果current_user.transaction[:account_name] 为零,则返回一个空数组。 (而不是 [nil])。意思是,[].each 永远不会执行。
【解决方案3】:
<% if current_user.transaction[:account_name].is_a?(String) %>
  <% current_user.transaction[:account_name].each_line do |name| %>
      balaballa
  <% end %>
<% elsif current_user.transaction[:account_name].is_a?(Array)%>
  <% current_user.transaction[:account_name].each do |name| %>
      balaballa
  <% end %>
<% end %>

【讨论】:

  • 如果数组为空且循环被调用,您已经错过了这种情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 2020-06-20
  • 2016-05-29
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
相关资源
最近更新 更多