轨道中的问号,感叹号和选择方法

时间:2015-04-13 07:24:35

标签: ruby-on-rails ruby

http://jsfiddle.net/fidlesteex/xb10L4d3/

<% categories.select! {|x| !x.nil?} %>
<% end %>
我可以在上面的代码中澄清一下吗?

我一直在CA学习,它倾向于快速跟踪事情。我可以知道在哪里可以找到有关上述脚本的更多信息吗?如果我理解正确,只要“当前”选择的记录不为空,它就会执行块中的所有操作?感叹号就像一个(这个)?谢谢你的回复!

2 个答案:

答案 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有savesave!,后者在验证失败时会引发异常。

问号用于英语;在提问时。字符串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

相关问题