2012-07-19 242 views
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,除非上面是真實的,如:

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

但它拒絕一切。

回答

4

你是在一對夫婦的方式爲自己創造疼痛:

  1. 的參數打印是含糊不清的。您應該使用print(...)而不能有空格。

  2. Do/end的結合程度比{...}塊要小。再一次,你的例子對於解析器來說有點不明確。

嘗試使用較不明確的語法,並在查看替代結構之前查看是否清除了內容。

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 
+0

啊,是的,謝謝。爲什麼do ...不能用圓括號工作? – 2012-07-19 21:15:58

+0

也許是因爲解析器,它在每種情況下都不會很聰明,請參閱第二個變體。 – megas 2012-07-19 21:19:16