1
print sentence.scan(/\[(\w+)\]/).all? do |word|
    @words.keys.include? word[0].to_sym
end

我已经打印了 的各个值,@words.keys.include? word[0].to_sym但它们并不都是真的,但它会打印true. 我认为这可能是因为它的评估是这样的:

(print sentence.scan(/\[(\w+)\]/).all?) do |word|
    @words.keys.include? word[0].to_sym
end

但我希望它评估为

print (sentence.scan(/\[(\w+)\]/).all? do |word|
    @words.keys.include? word[0].to_sym
end)

但是,添加括号会导致

syntax error, unexpected keyword_do_block, expecting ')'

如何更改评估代码段的顺序?

编辑:

除非上述情况属实,否则我想返回 true 而不是 print,例如:

    @sentences.reject do |sentence|
        !(sentence.scan(/\[(\w+)\]/).all? { |word| @words.keys.include? word[0].to_sym })
    end

但它拒绝一切。

4

2 回答 2

4

您正在以两种方式为自己制造痛苦:

  1. 打印的论点是模棱两可的。你应该使用print(...)没有空格。

  2. Do/end 绑定不如{...}块紧密。同样,您的示例对于解析器来说有些模棱两可。

尝试不那么模棱两可的语法,并在查看替代结构之前看看是否可以解决问题。

于 2012-07-19T21:18:49.897 回答
3

这个变体对我有用:

print (sentence.scan(/\[(\w+)\]/).all?{|word| words.keys.include? word[0].to_sym })

第二种变体:

print begin
  (sentence.scan(/\[(\w+)\]/).all? do |word|
    words.keys.include? word[0].to_sym
  end)    
end
于 2012-07-19T21:13:58.727 回答