Ruby 演算子

Ruby は豊富な演算子をサポートしています。ほとんどの演算子は実際にはメソッド呼び出しです。例えば、a + b は a.+(b) と解釈され、変数 a が参照するオブジェクトの + メソッドが呼び出され、b がメソッド呼び出しの引数として渡されます。

各演算子(+ - * / % ** & | ^ << >> && ||)には、対応する省略形の代入演算子(+= -= など)があります。

Ruby 算術演算子

変数 a の値が 10、変数 b の値が 20 であると仮定します。

演算子説明例
+加算 - 演算子の両側のオペランドを加算しますa + b は 30 になります
-減算 - 左オペランドから右オペランドを減算しますa - b は -10 になります
*乗算 - 演算子の両側のオペランドを乗算しますa * b は 200 になります
/除算 - 左オペランドを右オペランドで除算しますb / a は 2 になります
%剰余 - 左オペランドを右オペランドで除算した余りを返しますb % a は 0 になります
**指数 - 指数計算を実行しますa**b は 10 の 20 乗になります

Ruby 比較演算子

変数 a の値が 10、変数 b の値が 20 であると仮定します。

演算子説明例
==2つのオペランドの値が等しいかどうかを確認し、等しければ条件は真になります。(a == b) は真ではありません。
!=2つのオペランドの値が等しいかどうかを確認し、等しくなければ条件は真になります。(a != b) は真です。
>左オペランドの値が右オペランドの値より大きいかどうかを確認し、大きければ条件は真になります。(a > b) は真ではありません。
<左オペランドの値が右オペランドの値より小さいかどうかを確認し、小さければ条件は真になります。(a < b) は真です。
>=左オペランドの値が右オペランドの値以上であるかどうかを確認し、そうであれば条件は真になります。(a >= b) は真ではありません。
<=左オペランドの値が右オペランドの値以下であるかどうかを確認し、そうであれば条件は真になります。(a <= b) は真です。
<=>結合比較演算子(宇宙船演算子)。最初のオペランドが2番目のオペランドと等しい場合は 0 を返し、最初のオペランドが2番目のオペランドより大きい場合は 1 を返し、最初のオペランドが2番目のオペランドより小さい場合は -1 を返します。(a <=> b) は -1 を返します。
===テストに使用:casecase 文の when 句内の等価性。(1...10) === 5 は true を返します。
.eql?レシーバと引数が同じ型かつ等しい値を持つ場合に true を返します。1 == 1.0 は true を返しますが、1.eql?.eql?(1.0) は false を返します。
equal?レシーバと引数が同じオブジェクト ID を持つ場合に true を返します。aObj が bObj のコピーである場合、aObj == bObj は true を返しますが、a.equal?.equal?bObj は false を返しますが、a.equal?.equal?aObj は true を返します。

Ruby 代入演算子

変数 a の値が 10、変数 b の値が 20 であると仮定します。

演算子説明例
=単純な代入演算子。右オペランドの値を左オペランドに代入します。c = a + b は a + b の値を c に代入します。
+=加算代入演算子。右オペランドと左オペランドを加算した結果を左オペランドに代入します。c += a は c = c + a と同等です。
-=減算代入演算子。左オペランドから右オペランドを減算した結果を左オペランドに代入します。c -= a は c = c - a と同等です。
*=乗算代入演算子。右オペランドと左オペランドを乗算した結果を左オペランドに代入します。c *= a は c = c * a と同等です。
/=除算代入演算子。左オペランドを右オペランドで除算した結果を左オペランドに代入します。c /= a は c = c / a と同等です。
%=剰余代入演算子。2つのオペランドの剰余を求め、左オペランドに代入します。c %= a は c = c % a と同等です。
**=指数代入演算子。指数計算を実行し、左オペランドに代入します。c **= a は c = c ** a と同等です。

Ruby 多重代入

Ruby は変数の多重代入もサポートしています。これにより、複数の変数を1行の Ruby コードで初期化できます。例:

a = 10 b = 20 c = 30

多重代入を使用すると、より速く宣言できます:

a, b, c = 10, 20, 30

多重代入は、2つの変数の値を交換するときにも便利です:

a, b = b, c

Ruby ビット演算子

ビット演算子はビットに対して作用し、ビット単位で演算を実行します。

a = 60、b = 13 と仮定すると、2進数形式では次のようになります:

a = 0011 1100

b = 0000 1101

-----------------

a&b = 0000 1100

a|b = 0011 1101

a^b = 0011 0001

~a  = 1100 0011

次の表に Ruby がサポートするビット演算子を示します。

演算子説明例
&両方のオペランドに存在する場合、バイナリ AND 演算子はビットを結果にコピーします。(a & b) は 12、すなわち 0000 1100 になります。
|いずれかのオペランドに存在する場合、バイナリ OR 演算子はビットを結果にコピーします。(a | b) は 61、すなわち 0011 1101 になります。
^一方のオペランドには存在するが両方には存在しない場合、バイナリ XOR 演算子はビットを結果にコピーします。(a ^ b) は 49、すなわち 0011 0001 になります。
~バイナリ補数演算子は単項演算子で、ビットを反転させる効果があります。つまり 0 は 1 に、1 は 0 になります。(~a) は -61、すなわち 1100 0011 になります。これは符号付き2進数の補数形式です。
<<バイナリ左シフト演算子。左オペランドの値を右オペランドで指定されたビット数だけ左にシフトします。a << 2 は 240、すなわち 1111 0000 になります。
>>バイナリ右シフト演算子。左オペランドの値を右オペランドで指定されたビット数だけ右にシフトします。a >> 2 は 15、すなわち 0000 1111 になります。

Ruby 論理演算子

次の表に Ruby がサポートする論理演算子を示します。

変数 a の値が 10、変数 b の値が 20 であると仮定します。

演算子説明例
and論理積演算子と呼ばれます。両方のオペランドが真の場合、条件は真になります。(a and b) は真です。
or論理和演算子と呼ばれます。2つのオペランドのいずれかが非ゼロの場合、条件は真になります。(a or b) は真です。
&&論理積演算子と呼ばれます。両方のオペランドが非ゼロの場合、条件は真になります。(a && b) は真です。
||論理和演算子と呼ばれます。2つのオペランドのいずれかが非ゼロの場合、条件は真になります。(a || b) は真です。
!論理否定演算子と呼ばれます。オペランドの論理状態を逆転させるために使います。条件が真の場合、論理否定演算子はそれを偽にします。!(a && b) は偽です。
not論理否定演算子と呼ばれます。オペランドの論理状態を逆転させるために使います。条件が真の場合、論理否定演算子はそれを偽にします。not(a && b) は偽です。

Ruby 三項演算子

3つのオペランドを取る演算子は三項演算子と呼ばれます。最初に式の真偽値を評価し、その結果に基づいて後続の2つの文のいずれかを実行します。条件演算子の構文は次のとおりです:

演算子説明例
? :条件式条件が真の場合 ? 値は X : それ以外は値は Y

Ruby 範囲演算子

Rubyでは、シーケンス範囲は連続する値の系列を作成するために使用されます - 開始値、終了値(場合による)、およびそれらの間の値を含みます。

Rubyでは、これらのシーケンスは ".." と "..." 範囲演算子を使用して作成されます。2点形式で作成された範囲は開始値と終了値を含み、3点形式で作成された範囲は開始値のみを含み終了値は含みません。

演算子説明例
..開始点から終了点までの範囲を作成します(終了点を含む)1..10 は 1 から 10 までの範囲を作成します
...開始点から終了点までの範囲を作成します(終了点を含まない)1...10 は 1 から 9 までの範囲を作成します

Ruby defined? 演算子

defined? は特別な演算子で、メソッド呼び出しの形式で渡された式が定義されているかどうかを判断します。式の説明文字列を返し、式が未定義の場合は nil を返します。nil。

以下は defined? 演算子のさまざまな使い方です:

用法 1

defined? variable #variable がすでに初期化されている場合、True

例:

foo = 42 defined? foo # => "local-variable" defined? $_ # => "global-variable" defined? bar #=> nil(未定義)

用法 2

defined? method_call #メソッドがすでに定義されている場合、True

例:

defined? puts # => "method" defined? puts(bar) #=> nil(ここでは bar は未定義) defined? unpack #=> nil(ここでは未定義)

用法 3

#super ユーザーによって呼び出し可能なメソッドが存在する場合、True defined? super

例:

defined? super #=> "super"(呼び出し可能な場合) defined? super #=> nil(呼び出し不可能な場合)

用法 4

defined? yield #コードブロックが渡された場合、True

例:

defined? yield #=> "yield"(ブロックが渡された場合) defined? yield #=> nil(ブロックが渡されていない場合)

Ruby ドット演算子 "." とダブルコロン演算子 "::"

メソッド名の前にクラス名またはモジュール名と.を付けることで、クラスまたはモジュール内のメソッドを呼び出すことができます。クラス名またはモジュール名と2つのコロンを使用して::クラスまたはモジュール内の定数を参照できます。

::は単項演算子で、クラスまたはモジュール内で定数、インスタンスメソッド、クラスメソッドを定義することを可能にし、クラスまたはモジュール外のどこからでもアクセスできます。

覚えておいてください:Rubyでは、クラスとメソッドも定数として扱うことができます。

式の定数名の前に::接頭辞を付けるだけで、適切なクラスまたはモジュールオブジェクトを返すことができます。

もし::前の式がクラス名またはモジュール名の場合、そのクラスまたはモジュール内の対応する定数値を返します。もし::前に接頭辞式がない場合は、メインのObjectクラス内の対応する定数値を返します。

以下は2つの例です:

MR_COUNT = 0 #メインのObjectクラスで定義された定数 module Foo MR_COUNT = 0 ::MR_COUNT = 1 #グローバルカウントを1に設定 MR_COUNT = 2 #ローカルカウントを2に設定 end puts MR_COUNT #これはグローバル定数です puts Foo::MR_COUNT #これは "Foo" のローカル定数です

2番目の例:

CONST = ' out there' class Inside_one CONST = proc {' in there'} def where_is_my_CONST ::CONST + ' inside one' end end class Inside_two CONST = ' inside two' def where_is_my_CONST CONST end end puts Inside_one.new.where_is_my_CONST puts Inside_two.new.where_is_my_CONST puts Object::CONST + Inside_two::CONST puts Inside_two::CONST + CONST puts Inside_one::CONST puts Inside_one::CONST.call + Inside_two::CONST

Ruby 演算子の優先順位

次の表は、演算子の優先順位を高い順から低い順にすべての演算子をリストしています。

メソッド演算子説明
である :: 定数解決演算子
である [ ] [ ]= 要素参照、要素代入
である ** 指数
である ! ~ + - 否定、補数、単項加算、単項減算(最後の2つのメソッド名は +@ と -@)
である * / % 乗算、除算、剰余
である + - 加算と減算
である >> << ビット右シフト、ビット左シフト
である & ビットAND
である ^ | ビットXOR、ビットOR
である <= < > >= 比較演算子
である <=> == === != =~ !~ 等価およびパターンマッチ演算子(!= と !~ はメソッドとして定義できません)
&& 論理AND
|| 論理OR
.. ... 範囲(含む、含まない)
? : 三項 if-then-else
= %= { /= -= += |= &= >>= <<= *= &&= ||= **= 代入
defined? 指定されたシンボルが定義されているかどうかを確認
not 論理否定
or and 論理合成

注意:メソッド列で「はい」と識別されたである演算子は実際にはメソッドであり、そのためオーバーロードできます。

その他の拡張