Rabbit Slide Show

Ruby 2.3 のてざわり

2016-01-30

Description

2016/01/30 に開催の富山合同勉強会2016の発表資料 Ruby 2.3 の機能についてお話します。

Text

Page: 1

Ruby 2.3 のてざ
わり
新機能と使いどころ
Kunihiko Ito
ESM
富山合同勉強会 2016
2016-01-30

Page: 2

はじめ
まして

Page: 3

p self

Page: 4

p self
名前: 伊藤 邦彦
出身: 富山
在住: 東京
所属: ESM アジャイル事業部
仕事: [Rails, neo4j]

Page: 5

@kunitoo

Page: 6

@kunitoo

Page: 7

From Java To Ruby
変わったこと
IDE を使わなくなった
REPLで試しながら書くようにな
った

Page: 8

プログラムを書くときにして
いること
rails console を立ちあげる
1. console に書いて試していく
2. ファイルに書き移していく
3. 複雑になったらテストを書く

Page: 9

今日伝え
たいこと

Page: 10

Ruby お
もしろい

Page: 11

Ruby を
触ってみた
い

Page: 12

今日の内容
昨年の12月25日にリリースされた
Ruby 2.3 の新機能とその使いどこ
ろを紹介します

Page: 13


        

Page: 14

Ruby
2.3 新機
能

Page: 15

すぐに使える
safe navigation operator
SQUIGGLY HEREDOC

Page: 16

使う機会が増えそう
#dig
Enumerable#grep_v

Page: 17

その他
the did_you_mean gem
NameError#receiver
Hash#to_proc

Page: 18

すぐに使える
safe navigation operator
SQUIGGLY HEREDOC

Page: 19

safe navigation
operator
別名
‐ lonely operator
‐ ぼっち演算子
Active Support の try! と同様
の挙動

Page: 20

safe navigation
operator
obj = nil
obj.hoge #=> NoMethodError:
# undefined method `hoge' for nil:NilClass
obj&.hoge #=> nil

Page: 21

&.

Page: 22

&. の使いどころ
ユーザーがログインしていないとき
current_user = nil
current_user&.name #=> nil
current_user.try!(:name) #=> nil
currnet_user = User.find_by(name: 'kunitoo')
current_user&.name #=> 'kunitoo'
current_user.try!(:name) #=> 'kunitoo'

Page: 23

SQUIGGLY HEREDOC
ヒアドキュメント内のインデントを
取り除く `<<~` リテラルです
Active Support の
strip_heredoc と同様の動きをし
ます

Page: 24

SQUIGGLY HEREDOC
# 通常のヒアドキュメント
<<-HEREDOC
hoge
fuga
HEREDOC
#=> "
hoge\n\n
# SQUIGGLY HEREDOC
<<~SQUIGGLY_HEREDOC
hoge
fuga\n"
fuga
SQUIGGLY_HEREDOC #=> "hoge\n\nfuga\n"

Page: 25

SQUIGGLY HEREDOC
# strip_heredoc
<<-HEREDOC.strip_heredoc
hoge
fuga
HEREDOC
#=> "hoge\n\nfuga\n"
# SQUIGGLY HEREDOC
<<~SQUIGGLY_HEREDOC
hoge
fuga
SQUIGGLY_HEREDOC #=> "hoge\n\nfuga\n"

Page: 26

SQUIGGLY_HEREDOC の
使いどころ
簡易なメッセージやQueryのテン
プレートとして使う

Page: 27

SQUIGGLY_HEREDOC の
使いどころ
def calc_billin
query = <<~SQL
INSERT INTO bills (name, total)
SELECT name, sum(amount) AS total
FROM
orders
JOIN
...
WHERE ...
SQL
ActiveRecord::Base.connection.execute(query)
end

Page: 28

使う機会が増えそう
#dig
Enumerable#grep_v

Page: 29

#dig
追加されたクラス
‐ Array
‐ Hash
‐ Struct
‐ OpenStruct
深い階層にある値を取得するこ
とができる

Page: 30

#dig
a = [[1, 2], [3, 4]]
a.dig(0, 1) #=> 2
a.dig(1, 2) #=> nil
h = {foo: {bar: 1}}}
h.dig(:foo, :bar) #=> 1

Page: 31

#dig
dig メソッドを持つオジェクトであ
れば、交ざっていても使えます
user = {
user: {
address: [
{name: '富山市', ruby: 'とやまし'},
{name: '呉羽町', ruby: 'くれはまち'}
]
}
}
user.dig(:user, :address, 1, :name) #=> " 呉羽町 "
user.dig(:user, :address, 2, :name) #=> nil

Page: 32

#dig の使いどころ
JSON の値の取得
Hash の値に Array がある場合
request paramter
user = JSON.parse(request.body)

Page: 33

#dig の使いどころ
(0..1).map {|index|
user.dig(:user, :address, index, :name)
} #=> [" 呉羽町 ", nil]

Page: 34

Enumerable#grep_v
Enumerable#grep のマッチの条
件を逆にして、pattern ===
item が成立 しない要素を全て含ん
だ配列を返します
(1..10).grep_v 2..5 # => [1, 6, 7, 8, 9, 10]

Page: 35

正規表現クイズ
Bob, John, Jahn の中から Jo から
始まる名前以外を抽出するには?
1. ^[^Jo]
2. ^[^J][^o]
3. ^(?!Jo)

Page: 36

こたえ
3. ^(?!Jo)
names.grep /^[^Jo]/ #=> ['Bob']
names.grep /^[^J][^o]/ #=> []
names.grep /^(?!Jo)/ #=> ["Bob", "Jahn"]

Page: 37

Enumerable#grep_v の
使いどころ
Enumerable#grep では逆の条件
が書きづらいときや型情報を使うと
き
['Bob', 'John', 'Jahn'].grep_v /^Jo/ #=> ["Bob", "Jahn"]
[1, '1', 1.0].grep_v String #=> [1, 1.0]

Page: 38

the did_you_mean gem
did_you_mean gem がバンドル
されるようになりました。
NameError と NoMethodError
の発生時、デバッグを容易にするた
め、正しい名前と思われる候補を合
わせて表示します。

Page: 39

the did_you_mean
gem の使いどころ
irb や rails console でお世話にな
ります。自信のないスペルでも調べ
なくてもよくなります。

Page: 40

the did_you_mean
gem の使いどころ
'hello'.revarse
# => NoMethodError: undefined method `revarse' for "hello":String
# Did you mean? reverse
#
reverse!
'str'.encodeing
# => NoMethodError: undefined method `encodeing' for "str":String
# Did you mean? encoding
#
encode
#
encode!

Page: 41

NameError#receiver
NameError が発生した時のレシー
バオブジェクトを返します
begin
'abc'.foo
rescue => e
p e.receiver
end #=> 'abc'

Page: 42

NameError#receiver の
使いどころ
module DidYouMean
class VariableNameChecker
... snip ...
def initialize(exception)
@name
= exception.name.to_s.tr("@", "")
@lvar_names = exception.local_variables
= exception.receiver
receiver
@method_names =
@ivar_names
=
@cvar_names
=
@cvar_names +=
end
end
end
receiver.methods + receiver.private_methods
receiver.instance_variables
receiver.class.class_variables
receiver.class_variables if receiver.kind_of?(Module)

Page: 43

NameError#receiver の
使いどころ
デバッグするときに呼び出し元のオ
ブジェクトそのものを取得できる

Page: 44

Hash#to_proc
self に対応する Proc オブジェク
トを返します。
[1, 2, 3].map(&h) # => [10, 20, 30]

Page: 45

Hash#to_proc の使いど
ころ
おもいつきません...

Page: 46

その他
frozen string literal
String#+@, String#-@

Page: 47

まとめ
Rails に存在した &. や
HEREDOC はすぐに使えそう
#dig や grep_v は意識していれ
ば、使えるところがありそう
Hash#to_proc はだれか使いど
ころおしえてください

Page: 48

Enjoy
Ruby

Other slides