首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有常量的奇怪的ruby行为

具有常量的奇怪的ruby行为
EN

Stack Overflow用户
提问于 2013-05-19 01:08:20
回答 1查看 65关注 0票数 1

有没有人能解释一下,为什么我最初的常量LIST从一开始就被操纵了?我认为常量可以只初始化一次。我希望在不影响原始数组(LIST)的情况下,将操作存储在新的数组(new_list)中。

代码语言:javascript
复制
$ned = "foo"
$med = ""

print LIST = [:nrd, :mrd_y] # -> [:nrd, :mrd_y]


list = LIST

new_list = list.delete_if { |element|
  case element
  when :nrd then $ned.empty?
  when :mrd_y then $ned.empty? || $med.empty?
  end
}

print new_list # -> [:nrd]

print LIST # -> [:nrd] instead of [:nrd, :mrd_y]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-19 01:11:52

Array#delete_if ->删除块计算为true的self的每个元素。

代码语言:javascript
复制
$ned = "foo"
$med = ""

LIST = [:nrd, :mrd_y]
p LIST.object_id #=> 84053120
list = LIST
p LIST.object_id #=> 84053120
new_list = list.delete_if { |element|
  case element
  when :nrd then $ned.empty?
  when :mrd_y then $ned.empty? || $med.empty?
  end
}

Listlist持有相同的Array对象,object_id如上所述。因此,对于来自块的每个true求值,delete_if都会从84053120引用的对象中删除项。由LISTlist保存。所以你可以使用下面的代码:

代码语言:javascript
复制
$ned = "foo"
$med = ""

LIST = [:nrd, :mrd_y] 
list = LIST
new_list = list.dup.delete_if { |element|
  case element
  when :nrd then $ned.empty?
  when :mrd_y then $ned.empty? || $med.empty?
  end
}

p new_list #=>[:nrd]
p LIST #=>[:nrd, :mrd_y]

或(更好的方法使用Array#reject),

代码语言:javascript
复制
$ned = "foo"
$med = ""

list = [:nrd, :mrd_y]  
new_list = list.reject { |element|
  case element
  when :nrd then $ned.empty?
  when :mrd_y then $ned.empty? || $med.empty?
  end
}
p new_list #=>[:nrd]
p list #=>[:nrd, :mrd_y]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16626876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档