2

|=今日初めて見たので、それがどのように機能し、いつ役立つかを理解しようとしています.

いくつかの実験は次のことを示しています。

var |= nil
# => false
var |= false
# => false
var |= true
# => true
var |= 1
# => true
var |= nil
# => true
var |= false
# => true
var
# => true

Github の html-pipeline gem にあります。

  def link_to_mentioned_user(login)
    result[:mentioned_usernames] |= [login]
    url = File.join(base_url, login)
    "<a href='#{url}' class='user-mention'>" +
    "@#{login}" +
    "</a>"
  end

|=で保護された割り当てのように機能すると想定してい||=ますが、ブール値に割り当てられる式の戻り値をキャストします。varこれは、が偽または未定義である 限り、式が評価され、ブール値にキャストされた戻り値が割り当てられることを意味します。var |= some_truthy_expressionが呼び出されるとすぐにvarになりtrue、さらに を呼び出すとvar |= expression_will_not_be_called、式は評価されません。

  1. |=そのように動作しますか? Ruby ドキュメントのどこで見つけることができますか?
  2. いつ|=便利になりますか?
4

3 に答える 3

5

特定の演算子opについては、次のようになります。

a op= b

多かれ少なかれ省略形です:

a = a op b

もちろん、何|を意味するかは、あなたが何をしているのかに依存します|:

  • の場合Integerは、ビットごとの OR です。
  • falsetrue、およびの場合nilは、ブール OR です。
  • の場合Array、集合単位の和集合です。

あなたの場合:

result[:mentioned_usernames] |= [login]

あなたはおそらく配列を扱っています.RHSの配列は無料です. その結果、まだ存在しない場合result[:mentioned_usernames]は追加されます。login副作用もあります: ;|=から重複を削除します。result[:mentioned_usernames]例えば:

>> a = [1,2,3,4,4]
=> [1, 2, 3, 4, 4]
>> a |= [1]
=> [1, 2, 3, 4]
于 2013-08-06T22:46:46.257 に答える
2

foo |= barに展開され、引数でオブジェクトfoo = foo | barのメソッドを呼び出します。したがって、関連するドキュメントは、クラスが何であれ、オペレーターのドキュメントになります。|foobar|foo

の左オペランドが|ブール値または nil の場合、論理「or」演算を実行します。||常にブール値を返すことを除いて、 と同じ結果になります。とのもう 1 つの違い||は、短絡しないことです。これはメソッド呼び出しであるため、メソッド本体が実行される前にレシーバーと引数の両方が評価されます。

の左オペランドが|整数の場合、右オペランドも整数である必要があり、結果はビット単位または 2 つの整数になります。

左のオペランドが配列またはセットの場合、右のオペランドも配列またはセットである必要があり、結果は 2 つの配列またはセットのセット ユニオンになります (同様&に、セットの交点になります)。

左のオペランドがメソッドを定義しないクラス|の場合 (ここでは触れていないほとんどの標準クラスがこれに該当します) NoMethodError、.

于 2013-08-06T22:46:36.740 に答える
1

Ruby |= 代入演算子にヘルプが見つかりました。

a |= bは と同等です。したがって、共用体配列a = a | bの省略形です。

コードベースの例のように使用する場合:

results ||= []
results |= ['item'] # shorthand for results = results | ['item']
results #=> ['item']

# Array union excludes duplicates and preserves the order from the original array
results |= ['item']
results #=> ['item']

ご助力いただきありがとうございます。質問をすることで学べることは非常に信じられないことです :)

于 2013-08-06T22:53:24.600 に答える