http://jsfiddle.net/fidlesteex/xb10L4d3/
<% categories.select! {|x| !x.nil?} %>
<% end %>
我可以在上面的代码中澄清一下吗?
我一直在CA学习,它倾向于快速跟踪事情。我可以知道在哪里可以找到有关上述脚本的更多信息吗?如果我理解正确,只要“当前”选择的记录不为空,它就会执行块中的所有操作?感叹号就像一个(这个)?谢谢你的回复!
答案 0 :(得分:0)
不,此代码为categories
的每个元素运行块,并拒绝哪个块从categories
数组返回falsy值的元素。该块为{ |x| !x.nil? }
,因此它只在数组中保留非零值。方法名称末尾的感叹号和问号实际上是方法名称的一部分。以感叹号结尾的方法名称表明其使用可能会导致一些副作用(例如在这种情况下修改原始数组)。以问号结尾的方法名称表示它返回布尔值。
答案 1 :(得分:0)
感叹号和问号在Ruby方法中很常见。如果你以chomp
为例,它有两个变体 - 一个有一个,一个没有感叹号。不同之处是:
hello = "Hello World\n"
x = hello.chomp
# x == "Hello World", hello == "Hello World\n"
hello.chomp!
# hello is now "Hello world"
因此感叹号的变化修改了原始参数。尽管如此,他们并不总是意味着同样的事情。例如,在Rails中,ActiveRecord有save
和save!
,后者在验证失败时会引发异常。
问号用于英语;在提问时。字符串start_with?
就是一个例子。最佳实践要求以问题为后缀的方法将返回布尔值。
在您的示例中,您使用Array.select!
来保留块返回true的所有条目,请考虑另一个示例,再次使用start_with
:
x = ['hello', 'goodbye', 'hell']
x.select! do |str|
str.start_with? 'hell'
end
x
现在是['hello', 'hell']
,因为我们已使用select!
代替select