使用“do”时,Ruby块会出现意外行为

时间:2017-12-05 03:03:51

标签: ruby

我试图解决coding puzzle:取字符串,并计算不包含重复字词的字符串。

此代码有效:

def validate(passphrase)
  words = passphrase.split
  words == words.uniq
end

passphrases = File.readlines("../input/passphrases.txt")

p passphrases.count {|phrase| validate(phrase)}
#=> 337

如果我使用计数块进行一次微小的更改,它会计算所有密码,而不是仅仅在通过块时返回true的密码:

p passphrases.count do |phrase| 
  validate(phrase)
end
#=>512

这是怎么回事?

1 个答案:

答案 0 :(得分:3)

这是由于do块的参数优先级。

你的第一个例子相当于:

p(passphrases.count {|phrase| validate(phrase)})

do块的第二个等同于:

p(passphrases.count) do |phrase| 
  validate(phrase)
end

do应用于p函数。

如果您希望第二种情况与第一种情况匹配,请将整个块包装在括号中:

p(passphrases.count do |phrase| 
  validate(phrase)
end)