分析ruby数组中的元素

im9ewurl  于 2022-12-03  发布在  Ruby
关注(0)|答案(3)|浏览(148)

我喜欢解析字符串数组并更新值,例如:

list= ["beam=0", "active=0", "rate=11", "version=4.1", "delay=5"]

在上面的列表中,我想搜索“active”并编辑它的值,比如如果“active=0”,我想使它“active=1”,如果它的“active=1”,我想使它“active=0”。

What i am doing is , but its not correct ,, can someone assist in this:

list.each do |lists|
   if lists.include?("active=0")
      lists = "active=1"
   elsif list.include?("active=1")
      lists = "active=0"
   end
end

如果列表包含active=0,那么输出列表= [“beam=0”,“active=1”,“rate=11”,“version=4.1”,“delay=5”],如果列表包含active=1,那么输出列表= [“beam=0”,“active=0”,“rate=11”,“version=4.1”,“delay=5”],最后我期望的是什么

wnavrhmk

wnavrhmk1#

如果可以使用散列,则更适合此任务。
如果不能,那么代码的问题就在于没有更新原始值,而只是更新了#each迭代器中使用的变量。
一种方法是这样的:

list = ["beam=0", "active=0", "rate=11", "version=4.1", "delay=5"]

# convert to hash
hash = list.to_h { |x| x.split '=' }

# update any hash value
hash['active'] = hash['active'] == '0' ? '1' : '0'

# convert back to array
result = hash.map { |x| x.join '=' }

如果出于某种原因,你希望尽可能地接近你的原始代码,那么你可以使用map而不是each。我不推荐在这种情况下使用下面的代码,因为这不是一个好的编码,但是如果你有你的理由,这只是为了教育目的:

list = ["beam=0", "active=0", "rate=11", "version=4.1", "delay=5"]
result = list.map do |item|
  case item
  when 'active=0' then 'active=1'
  when 'active=1' then 'active=0'
  else
    item
  end
end
hfwmuf9z

hfwmuf9z2#

您可以迭代list并替换active=后面的数字,如下所示:

list= ["beam=0", "active=0", "rate=11", "version=4.1", "delay=5"]

list.each_with_index do |item, index|
  next unless item.starts_with?('active')

  number_with_active = item.split('active=')[1].to_i
  list[index] = "active=#{(number_with_active+1)%2}"
end
ffvjumwh

ffvjumwh3#

实际上,我会建议一种完全不同的方法;但是,您的原始代码的主要问题是您在开始时使用了不适当的方法。each没有返回修改过的数组。请尝试使用map。至少,您还需要添加一行代码以确保所有其他元素都返回未更改的数组。如果您不这样做,其他元素将被替换为nil值。下面是经过最小修改的代码:

list= ["beam=0", "active=0", "rate=11", "version=4.1", "delay=5"]

list.map do |lists|
   if lists.include?("active=0")
      lists = "active=1"
   elsif list.include?("active=1")
      lists = "active=0"
   else
      lists
   end
end

#=>  ["beam=0", "active=1", "rate=11", "version=4.1", "delay=5"]

相关问题