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

RubyでStructとOpenStructを使用する方法

Rubyの構造体とは何ですか?

構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。

ここに例があります

Point 2つの座標(xy

このデータはさまざまな方法で表すことができます。

いいね

  • 配列[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などのメソッドを使用できるため、これは便利です。 、selectsum 、など。

[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でStructとOpenStructを使用する方法

今度はあなたが練習する番です🙂


  1. マトリックスとは何ですか?Rubyでそれを使用する方法は?

    マトリックスは、スプレッドシートのようなデータを保存および操作するために使用できる2D(2次元)配列です。 次の用途に使用できます : テーブルゲーム(チェス、チェッカーなど)でボードを表す 統計とデータ分析 プロットとグラフの生成 これは強力なデータ構造であるため、使用方法を学ぶのに役立ちます。 Rubyでマトリックスを作成する方法 配列を使用して行列を作成できます。 このように : matrix = [ [1,2,3], [4,5,6], [7,8,9] ] これにより、3×3のマトリックスが生成されます。これは、2次元データをボードまたは位置のセットとして保

  2. Rubyエイリアスキーワードの使用方法

    Rubyメソッドに別の名前を付けるには、次の2つの方法があります。 エイリアス(キーワード) alias_method 彼らはわずかに異なる方法で同じことをするので、これは紛らわしいトピックになる可能性があります。 この画像は違いの要約です : しっかりと理解するために、これらの違いをさらに詳しく調べてみましょう! エイリアスキーワード まず、aliasがあります 、これはRubyキーワードです(ifなど) 、def 、class 、など) このように見えます : alias print_something puts print_something 1 prin