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 ではなく true を返したいと思います。

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

しかし、それはすべてを拒否します。

4

2 に答える 2

4

あなたはいくつかの方法で自分自身に苦痛を与えています:

  1. print の引数があいまいです。print(...)スペースなしで使用する必要があります。

  2. {...}Do/end バインドは、ブロックよりも緩くバインドされます。繰り返しますが、あなたの例はパーサーにとってややあいまいです。

あいまいさの少ない構文を試して、別の構文を検討する前に問題が解決するかどうかを確認してください。

于 2012-07-19T21:18:49.897 に答える
3

この変種は私のために働きます:

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

2 番目のバリアント:

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