Ruby评估顺序

时间:2012-07-19 21:05:26

标签: ruby

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

但它拒绝一切。

2 个答案:

答案 0 :(得分:4)

你正在以某种方式为自己创造痛苦:

  1. 打印的论点含糊不清。您应该使用print(...),不能有空格。

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

  3. 尝试使用不那么模糊的语法,看看是否在查看替代结构之前清除了这些内容。

答案 1 :(得分: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