Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
今更聞けない! Struct の使い方と今後の可能性について
Search
osyo
September 12, 2020
Programming
1.3k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
今更聞けない! Struct の使い方と今後の可能性について
osyo
September 12, 2020
More Decks by osyo
See All by osyo
5分で話せる Ruby 3.1
osyo
0
200
AST を使って ActiveRecord の where の条件式をブロックで記述しよう
osyo
2
1.3k
Vim の開発環境自慢
osyo
5
3.1k
Use Macro all the time ~ マクロを使いまくろ ~ 感想戦
osyo
0
340
Use Macro all the time ~ マクロを使いまくろ ~ (English)
osyo
3
460
Use Macro all the time ~ マクロを使いまくろ ~ (日本語)
osyo
0
2.4k
月単位でイテレーションする
osyo
0
380
Ruby 3.0 で変わった private と attr_xxx
osyo
1
820
Ruby 2.0 から Ruby 3.0 を駆け足で振り返る
osyo
0
2.4k
Other Decks in Programming
See All in Programming
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
140
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
500
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
140
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
210
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
210
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.6k
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
190
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.3k
symfony/aiとlaravel/boost
77web
0
130
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
4.4k
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
330
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
100
Featured
See All Featured
It's Worth the Effort
3n
188
29k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
320
KATA
mclloyd
PRO
35
15k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Crafting Experiences
bethany
1
220
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
280
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.6k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
250
Tell your own story through comics
letsgokoyo
1
1k
Transcript
とちぎRuby 会議09 とちぎRuby 会議09 今更聞けない! 今更聞けない! Struct の使い⽅と今後の可能性 Struct の使い⽅と今後の可能性
について について
⾃⼰紹介 ⾃⼰紹介 名前:osyo Twitter : github : ブログ : Rails
歴2 年半 趣味で Ruby にパッチを投げたり bugs.ruby で気になったチケッ トをブログにまとめたりしてる Ruby で⼀番好きな機能は Refinements @pink_bangbi osyo-manga Secret Garden(Instrumental)
Struct の使い⽅と Struct の使い⽅と 今後の可能性について 今後の可能性について
Struct とは! Struct とは!
Struct とは Struct とは 任意のプロパティを持ったクラスを動的に⽣成する Ruby の標準 ライブラリ # 3
つのプロパティを持つ疑似クラスを作成する User = Struct.new(:id, :name, :age) # 作成した疑似クラスは通常のクラスと同じように使⽤できる # 引数は Struct.new に渡した順で割り当てられる homu = User.new(1, "homu", 14) # 各プロパティのアクセッサが暗黙的に定義されている p homu.name # => "homu" p homu.age # => 14 homu.age = 15 p homu.age # => 15
参照⽅法いろいろ 参照⽅法いろいろ # アクセッサメソッドとして参照できる p homu.name # => "homu" p
homu.age # => 14 # [] メソッドで参照 # Hash みたいにキーを渡してアクセス p homu[:name] # => "homu" # index を渡してアクセス p homu[1] # => 15 # Hash に変換できる p homu.to_h # => {:id=>1, :name=>"homu", :age=>14} # 未定義のプロパティにはアクセスできない p homu.hoge # error: undefined method `hoge' p homu[:foo] # error: `[]': no member 'foo' in struct (NameError)
定義⽅法いろいろ 定義⽅法いろいろ # 3 つのプロパティを持つ疑似クラスを作成する User = Struct.new(:id, :name, :age)
# User.new には Struct.new で渡した引数の順番で渡す User.new(1, "homu", 14) # Struct.new に keyword_init: true を渡すと User = Struct.new(:id, :name, :age, keyword_init: true) # User.new にキーワード引数で渡せるようになる p User.new(name: "homu", age: 14, id: 1) # => #<struct User id=1, name="homu", age=14> # Struct.new にブロックを渡し、その中でメソッドを定義すると # インスタンスメソッドとして定義される User = Struct.new(:last_name, :first_name) do def full_name "#{last_name} #{first_name}" end end homu = User.new(" 巴", " マミ") # ユーザが定義したインスタンスメソッドが呼べる p homu.full_name # => " 巴 マミ"
Struct ってどういう時に使うの? Struct ってどういう時に使うの?
Struct を継承する Struct を継承する Struct.new はクラスオブジェクトを返す なので Struct.new を継承することができる Struct.new
を継承することで Struct の便利メソッドがそのまま 使える!! class User < Struct.new(:last_name, :first_name, :age) def full_name "#{last_name} #{first_name}" end def to_s "#{full_name} #{age} 歳" end end homu = User.new(" 巴", " マミ", 15) # Struct のメソッドがそのまま使える p homu.last_name # => " 巴" p homu.to_h # => {:last_name=>" 巴", :first_name=>" マ ミ", :age=>15}
引数や戻り値の擬似オブジェクトとして使う 引数や戻り値の擬似オブジェクトとして使う その場でデータ構造を定義してオブジェクトを⽣成する事がで きる テストとかの mock オブジェクトとかでも利⽤できる 疑似ファイルをテスト上で定義したりとか API モジュールの戻り値として定義したりとか
def show_file(file) puts "path: #{file.path}" puts "size: #{file.size}" puts "lines:" puts file.readlines end # 普通はファイルを渡して使う show_file File.open("./test.rb") # Tempfile というクラスをその場で定義してそのインスタンスを渡す Tempfile = Struct.new(:path, :size, :readlines) show_file Tempfile.new("./test.rb", 14, %w(homu mami mado))
Struct の今後の可能性… ? Struct の今後の可能性… ?
Anonymous Struct literal という機能が提案されている ${} というリテラルで Struct のオブジェクトを定義できるよう にする提案 これを使うと
Hash みたいにカジュアルに Struct オブジェク トが使える [Feature #16986] Anonymous Struct literal [Feature #16986] Anonymous Struct literal # 今の書き⽅ Struct.new(:a, :b).new(1, 2) # 提案してるリテラルだと ${} で定義できる ${ a: 1, b: 2 } # さっきのコード例 Tempfile = Struct.new(:path, :size, :readlines) show_file Tempfile.new("./test.rb", 14, %w(homu mami mado)) # ${} ですっきりとかける show_file ${ path: "./test.rb", size: 14, readlines: %w(homu mami mado) }
Hash との⽐較例 Hash との⽐較例 # Hash homu = { id:
1, name: "homu", age: 14 } # [] でのみ要素にアクセスできる homu[:name] # 新しい要素を追加できる homu[:job] = " 魔法少⼥" # 存在しないキーにアクセスしてもエラーにならない homu[:nmae] # => nil # Anonymous Struct literal homu = ${ id: 1, name: "homu", age: 14 } # [] だけでなくて . で参照できる homu.name # 新しい要素は追加できない # そもそも存在しない要素にアクセスするとエラーになる homu[:job] = " 魔法少⼥" # error: undefined method `[]'
まだ議論中です! まだ議論中です!
今どうなってる? 今どうなってる? ⼊るかどうかすら決まってません!! いろんな書き⽅の提案がされている ${} の $ は Struct の
S です そういえば Rubykaigi で matz が新しいシンタックスを⼊れたく ないって⾔っていたような… ? https://bugs.ruby-lang.org/issues/16986#note-11 ${a:1, b:2} # 元々の提案 {|a:1, b:2|} # <- matz のアイデア struct a: 1, b: 2 # struct キーワードを追加 %o{a:1, b:2} # % 記法で定義 (a:1, b:2) # {} ではなくて () で定義 Struct.anonymous(a:1, b:2) # メソッド定義 Struct(a:1, b:2) Struct[a:1, b:2]
まとめ まとめ
まとめ まとめ Struct はその場でちょっとしたデータ構造を持つオブジェクト を定義する時に便利 継承して使うとそのクラスのプロパティ周りの処理がスッキリ する mock やダックタイピングで呼び出されるオブジェクトを定義す る時とかにも利⽤できる
Anonymous Struct literal ほしい!!! ${} みたいな機能は実装されてからみんな使い始めて便利、みた いになりそう
ご清聴 ご清聴 ありがとうございました ありがとうございました