RubyでStructとOpenStructを使用する方法
Rubyの構造体とは何ですか?
構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。
ここに例があります :
Point
2つの座標(x
&y
。
このデータはさまざまな方法で表すことができます。
いいね :
- 配列
[10, 20]
- ハッシュ
{ x: 10, y: 10 }
- オブジェクト
Point.new(10, 20)
複数のPoint
を使用する場合 、オブジェクトアプローチを使用することをお勧めします。
しかし…
これら2つの値を一緒に格納するためだけに、クラス全体を作成する必要はありません。
Struct
の使用 この問題を解決します。
コンテンツ
- 1Rubyで構造体を作成する方法
- 1.1代替方法
- 1.2大きなメリット
- 2Ruby構造体の使用方法
- 3警告:構造体は扱いにくい場合があります
- 3.1別の奇妙なこと
- Ruby2.5の4つの名前付きパラメーター
- 5OpenStructの使用方法
- 6StructとOpenStruct
- 7ビデオチュートリアルを見る
- 8結論
- 8.1関連
やってみましょう!
Rubyで構造体を作成する方法
Struct
を作成できます new
を呼び出す &このクラスのインスタンス変数になるシンボルのリストを渡します。
読み取りと書き込みの両方で、デフォルトでアクセサメソッドが定義されます。
ここに例があります :
Person = Struct.new(:name, :age, :gender)
これで、このようなオブジェクトを作成できます :
john = Person.new "john", 30, "M" david = Person.new "david", 25, "M"
代替方法
野生で構造体を作成するこの別の方法を見つけるかもしれません。
このように見えます :
class Person < Struct.new(:name, :age, :gender) end
これはお勧めしません。
しかし、今それを見つければ、それが何をするのかがわかります。
大きなメリット
構造体の属性に基づいて直接比較できるのであれば、構造体の良いところです。
例 :
john == john # true
これが通常のRubyオブジェクトである場合は、==
を定義する必要があります。 自分で方法を教えてください。
これを「値オブジェクト」と呼びます。
Ruby構造体の使用方法
配列またはハッシュに対して構造体を使用することの主な利点の1つは、メソッドを使用して構造体メンバーにアクセスできることです。
例 :
puts john.age # 30 puts david.gender # "M"
オブジェクトの配列がある場合は、max
などのメソッドを使用できるため、これは便利です。 、select
、sum
、など。
例 :
[john, david].max_by(&:age)
いいね!
警告:構造体は扱いにくい場合があります
構造体で生成されたクラスに関するもう1つの注意点は、...
コンストラクターの正しい数の引数を強制しません!
説明させてください。
適切なクラスを使用すると、次のエラーが表示されます:
ArgumentError: wrong number of arguments (0 for 3)
ただし、Struct
を使用している場合 欠落している引数はnilになります:
Person.new("peter") # struct Person name="peter", age=nil, gender=nil
Struct
を使用する場合は、このことに注意してください。 オブジェクト!
別の奇妙なこと
これを見てください...
Struct.new(:a).ancestors [#<Class:0x29b1040>, Struct, Enumerable, Object, Kernel, BasicObject]
この#<Class:0x29b1040>
は構造体に追加された匿名クラスです。また、列挙可能なモジュールに注意してください。これにより、each&mapなどのメソッドを呼び出すことができます。
Ruby2.5の名前付きパラメーター
ファイルから行を読み取っていて、各行が1つのアイテムを表しているとします。
例 :
200 /login 18:00 404 /bacon 18:03 200 /books 18:04
カスタムクラスを作成すると、このデータをより簡単に操作できます。
このように :
LogEntry = Struct.new(:status, :url, :time) LogEntry.new(200, '/books', '18:04')
ただし、すべての引数が何を表しているかをさらに明確にするために、キーワード引数を使用することをお勧めします。
朗報です!
Ruby 2.5は、Struct
のキーワード引数のサポートを追加しました オブジェクト。
使用方法は次のとおりです :
LogEntry = Struct.new(:status, :url, :time, keyword_init: true) LogEntry.new(status: 200, url: '/books', time: '18:04')
これで、ファイルを解析してLogEntry
に変換できます。 オブジェクト!
OpenStructの使用方法
1回限りのオブジェクトが必要な場合は、OpenStruct
の使用を検討する必要があります。 代わりに。
コード例 :
require 'ostruct' cat = OpenStruct.new(color: 'black') puts cat.class puts cat.color
ostruct
を要求する方法に注意してください このクラスにアクセスできます。
警告:このredditコメントのschneemsによると、OpenStructは低速であり、本番アプリでは使用しないでください。また、これをサポートするいくつかのベンチマークがあるこのブログ投稿を見つけました。
構造体とOpenStruct
Struct
の違い &OpenStruct
:
- Structは新しいクラスを作成します 事前定義された属性、平等法(==)、列挙可能
- OpenStructは新しいオブジェクトを作成します 与えられた属性で
OpenStruct
Struct
は派手なハッシュオブジェクトですが、 テンプレートから新しいクラスを作成するようなものです。
ビデオチュートリアルを見る
結論
Ruby StructとOpenStructについて学びました!これらの各クラスの特別な特性を知っている限り、問題はありません。
今度はあなたが練習する番です🙂
-
マトリックスとは何ですか?Rubyでそれを使用する方法は?
マトリックスは、スプレッドシートのようなデータを保存および操作するために使用できる2D(2次元)配列です。 次の用途に使用できます : テーブルゲーム(チェス、チェッカーなど)でボードを表す 統計とデータ分析 プロットとグラフの生成 これは強力なデータ構造であるため、使用方法を学ぶのに役立ちます。 Rubyでマトリックスを作成する方法 配列を使用して行列を作成できます。 このように : matrix = [ [1,2,3], [4,5,6], [7,8,9] ] これにより、3×3のマトリックスが生成されます。これは、2次元データをボードまたは位置のセットとして保
-
Rubyエイリアスキーワードの使用方法
Rubyメソッドに別の名前を付けるには、次の2つの方法があります。 エイリアス(キーワード) alias_method 彼らはわずかに異なる方法で同じことをするので、これは紛らわしいトピックになる可能性があります。 この画像は違いの要約です : しっかりと理解するために、これらの違いをさらに詳しく調べてみましょう! エイリアスキーワード まず、aliasがあります 、これはRubyキーワードです(ifなど) 、def 、class 、など) このように見えます : alias print_something puts print_something 1 prin