Text
Page: 1
Ruby 2.3 のてざ
わり
新機能と使いどころ
Kunihiko Ito
ESM
富山合同勉強会 2016
2016-01-30
Page: 4
p self
名前: 伊藤 邦彦
出身: 富山
在住: 東京
所属: ESM アジャイル事業部
仕事: [Rails, neo4j]
Page: 7
From Java To Ruby
変わったこと
IDE を使わなくなった
REPLで試しながら書くようにな
った
Page: 8
プログラムを書くときにして
いること
rails console を立ちあげる
1. console に書いて試していく
2. ファイルに書き移していく
3. 複雑になったらテストを書く
Page: 12
今日の内容
昨年の12月25日にリリースされた
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: 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 はだれか使いど
ころおしえてください