Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby演算子について知っておくべきことすべて

Rubyには興味深い演算子がたくさんあります。

いいね

  • 宇宙船オペレーター( <=>
  • モジュロ代入演算子(%=
  • トリプルは等しい( === )演算子
  • より大きい(> )&未満( <
  • 等しくない(!=

気づかないかもしれませんが、これらの演算子の多くは実際にはRubyメソッドです。 。

これは…を意味します

それらの機能を上書きし、それらを使用して独自のクラスでカスタム動作を定義できます。

たとえば、 ==を定義します 同じクラスの2つのオブジェクトを比較する方法をRubyに指示できます。

これらのRuby演算子がどのように機能するか、およびそれらの使用方法の概要を理解できるように、いくつかの例を見ていきましょう。 コード内。

Rubyを本当に理解したいのであれば、これは重要なトピックです。

コンテンツ

  • 1Ruby論理演算子
  • 2つのRuby算術演算子
  • 3つの代入演算子(==、+ =、|| =)
  • 4単項演算子とは何ですか?
  • 5 Ruby Splat演算子(例付き)
  • 6マッチング演算子(=〜)
  • 7 Ruby三項演算子(疑問符演算子)
  • 8ショベル/プッシュオペレーター(<<)
  • 9トリプル等号演算子(等号以上)
  • 10セーフナビゲーター演算子(&。)
  • 11演算子の優先順位表
  • 12まとめ
    • 12.1関連

Ruby論理演算子

まず、論理演算子について見ていきます。

これらの演算子を使用すると、2つのオブジェクトを比較するのに役立ちます。 &結果に基づいて決定を下します。

表は次のとおりです:

演算子 説明 未満 大なり記号 以上 以下 等しい 等しくない
<
>
> =
<=
==
!=
<=> 大きい、等しい、または小さい

これらの演算子はすべてメソッドであり、ブール値を返します 、宇宙船のオペレーターを除いて。宇宙船のオペレーターは、1(より大きい)、0(等しい)、または-1(より小さい)のいずれかを返します。

>の使用方法の例を次に示します。 演算子:

if orange.stock > 20
  # ...
end

ダブルイコールを使用する場合( == )独自のクラスを持つ演算子を使用すると、最初は機能しない場合があります…

class Fruit
 def initialize(name)
  @name = name
 end
end

orange1 = Fruit.new("orange")
orange2 = Fruit.new("orange")

orange1 == orange2
# false

これは、 ==のデフォルトの実装が原因です。 BasicObject#==であり、 object_idを使用します 2つのオブジェクトが同じかどうかを確認する方法。

次のように修正できます:

class Fruit
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def ==(other)
    name == other.name
  end
end

ここでは、2つの果物が同じであるとはどういう意味かを言っています:

同じ名前である必要があります。

ルビー算術演算子

次の演算子のセットは算術演算子です。

ここでは何も新しいことはありません…

5 + 5
# 10

10 * 2
# 20

10 ** 2
# 100

しかし、 ==と同じように 演算子、これらはメソッドです。

これは、2つのオブジェクトを一緒に追加することの意味を定義できるので便利です。 。

したがって、 Orderが2つある場合 オブジェクトを合計すると、支払われる合計金額が得られます。または、これら2つの注文を組み合わせた新しい注文が得られます。

正確に定義できます + を定義して、それをどのように機能させるか メソッド。

なじみのないもう1つの演算子は、モジュロ演算子です。 。

パーセント記号のように見えます(

そしてそれがすることはあなたに部門の残りを与えることです

10 % 2
# 0

モジュロ演算子には多くの実用的な用途があります 、数値が偶数か奇数かを調べる、数値が別の数値で割り切れる場合、数値に制限を設けるなど。

代入演算子(==、+ =、|| =)

次は代入演算子です。これまで見てきたすべての演算子とは異なり、これらはメソッドではありません。

基本的な代入演算子があります:

a = 1

ただし、組み合わせた代入演算子もあります:

a += 5
# 6

a *= 2
# 12

これらは、現在の値を読み取り、算術演算子の1つを使用して、結果を保存するのと同じです。これは、モジュロ演算子(を含むすべての算術演算子を使用して実行できます。 。

ただし、動作が異なる2つの代入演算子があります!

これらは||=です および&&=

同等ではないため、これらは異なります 算術バージョンに。

a|| =100 これは何ですか:

aの場合 存在しないか、 falseの場合 またはnil 次に、 100を割り当てます それ以外の場合は、 aの値を返します。 」

同等の式に最も近いのは次のとおりです:

(defined?(a) && a) ? a : a = 100

これは、「メモ化」と呼ばれるプロセスである、遅い計算やAPIリクエストの結果を保存する場合に便利です。

単項演算子とは何ですか?

これまで、2つの値で機能する演算子しか見たことがありませんが、1つの値でのみ機能する演算子もあります。 、これらを「単項演算子」と呼びます。

+"abc"

これにより、フリーズされた文字列の変更可能なコピーが作成されます。

独自の単項演算子を定義できます( + /- )、ただし、特別な構文が必要です。

class String
  def +@
    frozen? ? self.dup : self
  end
end

str = "abc".freeze

p (+str).frozen?
# false

単項演算子の演算子の優先順位のため、ここでは括弧を使用する必要があります。

!!もあります 、これは方法ではありません:

!!123
# true

!!nil
# false

これは、任意の値をブール値に変換するので便利です。 。

次に、があります 、これは同じですが、反対のブール値が得られます。

!true
# false

!!true
# true

!false
# true

Ruby Splat演算子(例付き)

スプラット演算子( * )それなしではできないことをするので面白いです。

次のような配列があるとします:

attributes = [:title, :author, :category]

そして、この配列を attr_readerのような可変引数を取るメソッドで使用したいとします。 。

次に、これを行うことができます:

attr_reader *attributes

スプラット演算子 配列をその要素のリストに変換します。つまり、アレイを取り出して、その中のすべてのものに置き換えるようなものです。

つまり、最後の例は次のように変換されます。

attr_reader :title, :author, :category

それがスプラットオペレーターの力です🙂

マッチング演算子(=〜)

この変な格好のRuby演算子( =〜 )チルダ付き?

マッチング演算子です!

正規表現を使用してインデックス検索をすばやく実行できます。

次に例を示します:

"3oranges" =~ /[0-9]/
# 0

これは数字を検索し、最初の一致が見つかった文字列内のインデックスを返します 、それ以外の場合はnilを返します。

さらに、!〜があります 「不一致」演算子である演算子。

"abc" !~ /[0-9]/
# false

trueを取得します またはfalse これでは、インデックスがないので、それを覚えておいてください。

Ruby三項演算子(疑問符演算子)

コンパクトで短いコードが好きなら、Rubyの三項演算子を気に入るはずです。

これは、コンパクトなif/elseステートメントを作成する方法です。

このように見えます

condition ? true : false

ここに例があります

"".size == 0 ? "Empty string" : "Non-empty string"

これがその仕組みです

三項演算子の最初の部分は、条件を定義します(""。size==0

次に、疑問符の記号(

その後、この条件が真の場合の戻り値が得られます。 。

次にコロン(

そして最後の部分は、この条件がfalseの場合の戻り値です。 、これは elseになります 完全な条件式で。

シャベル/プッシュオペレーター(<<)

この演算子( << )もメソッドであるため、操作しているオブジェクトに応じて動作が変わります。

たとえば、配列の場合、これは pushの単なるエイリアスです。 メソッド。

animals = []

animals << "cat"

文字列を使用すると、末尾に追加されます:

"" << "cat"

そして整数で 、すべてのビットを左に回転させる「左シフト」を実行します。

2 << 1
# 4

2 << 2
# 8

2 << 3
# 16

トリプル等号演算子(等号以上)

今日の最後の演算子は、トリプルイコール演算子( ===)についてです。 。

これも方法であり、意外なところにも出てきます。

たとえば、caseステートメントの場合:

case "bacon"
when String
  puts "It's a string!"
when Integer
  puts "It's an integer"
end

Rubyは===を呼び出しています ここのクラスのメソッド。

このように:

String === "bacon"

これにより、現在のクラスが他のオブジェクトのクラスと比較されます。

したがって、この演算子のポイントは平等を定義することです ケースステートメントのコンテキストで。

安全なナビゲーター演算子(&。)

オブジェクトのメソッドを呼び出したい場合がありますが、このオブジェクトは nilである可能性があります 、 nil でメソッドを呼び出すため、これは適切ではありません。 多くの場合、エラーが発生します。

1つのソリューション

if user && user.active
  # ...
end

これを行うためのより良い方法

if user&.active
  # ...
end

この&。 は安全なナビゲーター演算子(Ruby 2.3で導入)であり、 activeのみを呼び出します。 userのメソッド nilでない場合 。

とても便利です!

演算子の優先順位表

Rubyは、乗算と括弧を使った数学で起こることのように、優先順位のリストに従ってソースコードを評価します。

動作を理解していないと、これがあらゆる種類のエラーの原因になる可能性があります。

これが優先順位の高いものから低いものへの表です

演算子
!,〜、単項+
**
単項-
*、/、%
+、-
<<、>>
|、^
>、> =、<、<=
<=>、==、===、!=、=〜、!〜
&&
||
?、:
修飾子-レスキュー
=、+ =、-=、* =、/ =、%=
定義済み?
ない
または、および
修飾子-if、修飾子-unless、修飾子-while、修飾子-until
{}ブロック
do...エンドブロック

修飾子付き-何かは、これらのキーワードのワンライナーバージョンを意味します。

puts "awesome" if blog_name == "rubyguides"
の場合、「素晴らしい」と表示されます

ブロックの優先順位に驚かされる例を次に示します。

# Returns array with uppercase characters
p ["a", "b", "c"].map { |character| character.upcase }

# Returns Enumerator object
p ["a", "b", "c"].map do |character|
  character.upcase
end

前者の場合は期待どおりに機能し、後者の場合はブロックの優先順位が低いため、 map ブロックがないと考えて列挙子を返します。

概要

算術演算子から論理演算子、さらにはもっとあいまいな単項演算子まで、Rubyの多くの演算子について学びました。

これらの演算子の多くは、実際には独自のクラスに実装できるメソッドです。

これがお役に立てて面白いと思います!

読んでくれてありがとう🙂


  1. Bluetooth 5 について知っておくべきことすべて

    Wi-Fi と同様に、Bluetooth はモバイルやその他のデバイスに不可欠な要素です。ファイルやデータの転送に使用されるだけでなく、スピーカー、スポーツ イヤホンなどのワイヤレス デバイスを接続することもできます。 Bluetooth は通信の方法を変えただけでなく、多くのデバイスをかさばるものからコンパクトなものに変えました。この新しいバージョンの Bluetooth では、以前のバージョンではできなかった多くのことが可能になります。ただし、新しいバージョンはそれほど例外的ではありません。しかし同時に、それはまだいくつかの新鮮なものをテーブルにもたらします.それでは、何が用意されている

  2. PBM ファイルについて知っておくべきことは?

    コンピューターが親しみやすいものになって以来、テクノロジーとエンターテインメントの分野で顕著な成長を目の当たりにすることができます。娯楽の最も一般的なソースの 1 つは、写真やその他のメディアです。ただし、現在のテクノロジでは、ファイルをサポートできる特定のツールを開くために正しいプログラムを選択する必要はありません。ただし、画像とその他のメディア ファイルは同じファイル タイプではなく、さまざまな拡張子が関連付けられていることを知っておくとよいでしょう。そのような拡張子の 1 つは、しばらくの間ユーザーの間で人気を集めている PBM ファイル拡張子です。今日は、PBM ファイルとその実行方法