Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
String#split何もわかっていなかった/didn_t_know_anything_about_string_split
Masatoshi Moritsuka
May 19, 2022
Programming
0
26
String#split何もわかっていなかった/didn_t_know_anything_about_string_split
Masatoshi Moritsuka
May 19, 2022
Tweet
Share
More Decks by Masatoshi Moritsuka
See All by Masatoshi Moritsuka
String#split何もわかっていなかった/didn-t-know-anything-about-string-split
sanfrecce_osaka
0
21
パターンマッチ使ってるかい?/use-ruby-s-pattern-matching?
sanfrecce_osaka
0
130
新しいコミュニティを立ち上げるぞい/launch-new-community
sanfrecce_osaka
0
30
コミュニティ・勉強会の情報収集について/about-collecting-community-information
sanfrecce_osaka
0
52
Ruby2.7の機能を使いたくてruby-next使ってみた/try-using-ruby-next
sanfrecce_osaka
0
68
業務のコード以外でRubyを書く/#write-ruby-other-than-business-code
sanfrecce_osaka
2
95
読みやすいコードを書くために気をつけていること/ be-careful-when-writing-readable-code
sanfrecce_osaka
0
140
Procのススメ/recommendation-of-proc
sanfrecce_osaka
0
3k
プログラミングの勉強について考えてみる/Think of programming learning
sanfrecce_osaka
2
470
Other Decks in Programming
See All in Programming
エンジニアによる事業指標計測のススメ
doyaaaaaken
1
190
React Nativeアプリを DDDで開発している話
nihemak
0
150
設計ナイト2022 トランザクションスクリプト
shinpeim
11
2.1k
Improving Developer Experience Through Tools and Techniques 2022
krzysztofzablocki
0
1.1k
git on intellij
hiroto_kitamura
0
170
iOS 16からのロック画面Widget争奪戦に備える
tsuzuki817
0
250
BASE BANKチームの技術選定と歴史 / how to decide technology selection for startup
budougumi0617
0
1.2k
シェーダー氷山発掘記
logilabo
0
150
GoogleI/O2022 LT報告会資料
shinsukefujita1126
0
370
Gitlab CIでMRを自動生成する
forcia_dev_pr
0
120
Deep Dive Into Google Zanzibar and its Concepts for Authorization Scenarios
dschenkelman
1
140
A Philosophy of Software Design 後半
yosuke_furukawa
PRO
10
2.8k
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
10
3.4k
Art Directing for the Web. Five minutes with CSS Template Areas
malarkey
196
9.4k
Producing Creativity
orderedlist
PRO
334
37k
Making the Leap to Tech Lead
cromwellryan
113
7.4k
VelocityConf: Rendering Performance Case Studies
addyosmani
316
22k
Building a Scalable Design System with Sketch
lauravandoore
448
30k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_i
23
15k
Mobile First: as difficult as doing things right
swwweet
213
7.5k
Creatively Recalculating Your Daily Design Routine
revolveconf
207
10k
Build The Right Thing And Hit Your Dates
maggiecrowley
19
1.2k
Thoughts on Productivity
jonyablonski
43
2.3k
Navigating Team Friction
lara
175
11k
Transcript
String#split 何もわかって いなかった 森塚 真年(@sanfrecce_osaka) 2022/05/18 K-Ruby#30 #k_ruby
\ ( 祝 )30 回/
自己紹介 森塚 真年 GitHub: @sanfrecce-osaka Twitter: @sanfrecce_osaka Qiita: @sanfrecce_osaka 株式会社エンペイ
Ruby3.1/Rails6.1 We are hiring!! from 神奈川
String#split
よく知っている
とある日 スペースで分割したかった # よく使っているパターン ' ほげ ふが '.split(/[[:space:]]/) # =>
["", "ほげ", "", "", "", "", "", "", "", "", "ふが"] # 挙動を確認するためirbで実行 ' ほげ ふが '.split(' ') ' ほげ ふが '.split(/ /)
なん・・・だと・・・? ' ほげ ふが '.split(' ') # => ["ほげ", "ふが"]
' ほげ ふが '.split(/ /) # => ["", "ほげ", "", "", "", "", "", "", "", "", "ふが"]
String#split の型シグネチャ def split: (?Regexp | string pattern, ?int limit)
-> Array[String] | (?Regexp | string pattern, ?int limit){ (String) -> void } -> self https://github.com/ruby/rbs/blob/v2.4.0/core/string.rbs#L2660
pattern( 正規表現 ) 通常 正規表現にマッチする部分で分割 括弧によるグルーピングがある場合 グループにマッチした文字列も結果に含む 空文字列にマッチする場合 文字列を1 文字ずつに分割
マルチバイト文字も認識 ' ほげ ふが '.split(/ /) # => ["", "ほげ", "", "", "", "", "", "", "", "", "ふが"] '1-10,20'.split(/([-,])/) # => ["1", "-", "10", ",", "20"] ' a cat '.split(/\s*/) # => ["", "a", "c", "a", "t"]
pattern( 文字列 ) 通常 その文字列自体にマッチする部分で分割 1 バイトの空白文字 先頭と末尾の空白を除く そのうえで空白文字列で分割 空文字列
文字列を1 文字ずつに分割 マルチバイト文字も認識 ',,a,b,c'.split(',') # => ["", "a", "b", "c"] ' a \t b \n c'.split(' ') # => ["a", "b", "c"] ' a cat '.split('') # => ["", "a", "c", "a", "t"]
pattern(nil) default( 厳密には$;) 常に$; で分割 $; もnil の場合 先頭と末尾の空白を除く そのうえで空白文字列で分割
" a \t b \n c ".split(nil) # => ["a", "b", "c"] " a \t b \n c ".split # => ["a", "b", "c"] # split(nil) と同じ
limit limit > 0 最大 limit 個の文字列に分割する limit == 0(default)
分割個数制限はなしで、配列末尾の空文字列 を取り除く limit < 0 分割個数の制限はなし 他言語のsplit も同様のインターフェース 動きは異なる "a,b,c,d,e".split(/,/, 3) # => ["a", "b", "c,d,e"] ",a,b,c,,,".split(/,/, 0) # => ["", "a", "b", "c"] ",a,b,c,,,".split(/,/, -1) # => ["", "a", "b", "c", ""]
block(2.6.0 〜 ) 配列を返す代わりに分割した文字列でブロック を呼び出す 参考記事内のベンチマークだとブロックなしの およそ倍の速度 fruits = []
input_str = "apple, mango, potato, banana, cabbage" input_str.split(", ") do |value| fruits << value if is_fruit?(value) end # => "apple, mango, potato, banana, cabbage" fruits # => ["apple", "mango", "banana"] https://techracho.bpsinc.jp/hachi8833/2018_07_31/59885
おまけ (C のコード ) https://github.com/ruby/ruby/blob/v3_1_2/string.c#L8674
最後に String#split は意外に多彩な動きをする Ruby は奥が深い 便利な処理の裏で色々頑張っている
ご清聴 ありがとうございました