try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
try!�から�.?�へ
(#11537)
表参道.rb#6
東京糸井重⾥事務所さま
2015-11-04
伊藤�浩⼀�(@koic)
(株)永和システ...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
About�Me
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
Come�and�Join�Us
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
Today's�Topic
Safe�navigation�operator✓
Ruby�2.3.0�に⼊る有⼒な�
Language�Changes�...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
2.3.0-dev
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
Safe�navigation�
operator
obj.?foo�という呼び出し⽅
で、Active�Support�の�try!�
に似た振る舞い...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
Other�Languages
Groovy�や�Swift,�C#�6.0�に相
当の機能があるらしい�(風聞)
✓
他の⾔語の�?.�と�.?�は似...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
どう書く?
上がActive�Supportのtry!で、
下がSafe�navigation�operator
✓
�����������������...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
Railsむかし話
Safe�navigation�operator�の
振る舞いは�try!�の⽅に似てる
Rails�4�で�try�の動きが変わっ...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
try�と�try!�(Rails�3)
try!�メソッドはそもそも存在せず
���������������
�����������
��������...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
try�と�try!�(Rails�4)
try�メソッドの振る舞いは変わる
���������������
����������
����������...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
Safe�navigation�
operator
Rails�3�の�try�あるいは�Rails�4�
の�try!�に似た感じになる
������...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
Active�Support�による�
try�のおさらい
Rails�4�での�Active�Support�
のコードを⾒てみましょう
✓
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
Rails�4�での�try�の実装
���������������
�����������������������������������������...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
try�の実装を⾒て
条件に⼀致しない場合は�nil�が
返る。つまり�respond̲to?�に
反応するメソッドがなければ�
nil�が返る
✓
つ...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
Rails�4�での�try!�の実装
����������������
�����������������������������
���������...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
try!�の実装を⾒て
try�と異なり�respond̲to?�は
⾒ていないので、メソッドがな
ければエラーになる
✓
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
あれ?(⼀瞬分からなくなる)
try!�はレシーバに存在しないメ
ソッド呼び出しをしたらエラー
になる
✓
nil�への対応のはずなのに、nil�
にな...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
Method#source̲locatio
n�を使った解析
メソッドの定義場所が違うらしい
�����������������������������...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
nil�専用の�try�実装
try.rb�にレシーバ�nil�専用の振る舞
いがある
��������������
����������������
...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
まとめ
上がActive�Supportのtry!で、
下がSafe�navigation�operator
✓
������������������
...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
考えられる移⾏
期待しているメソッドが存在し
ている前提で戻り値が�nil�の場
合を想定しているケースにおい
て、大体の場合は�try�ではな
く�t...
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
Safe�navigation�
operator�を試してみよう
�����������������������
try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8
To�be�continued...
https://bugs.ruby-lang.org/
issues/11537
✓
https://github...
Upcoming SlideShare
Loading in …5
×

Safe navigation operator in Ruby

2,576 views

Published on

表参道.rb #6 (http://omotesandorb.connpass.com/event/21811/)

obj&.foo になるかも?
https://bugs.ruby-lang.org/issues/11537#note-42

Published in: Engineering
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,576
On SlideShare
0
From Embeds
0
Number of Embeds
331
Actions
Shares
0
Downloads
2
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Safe navigation operator in Ruby

  1. 1. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 try!�から�.?�へ (#11537) 表参道.rb#6 東京糸井重⾥事務所さま 2015-11-04 伊藤�浩⼀�(@koic) (株)永和システムマネジメント
  2. 2. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 About�Me
  3. 3. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 Come�and�Join�Us
  4. 4. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 Today's�Topic Safe�navigation�operator✓ Ruby�2.3.0�に⼊る有⼒な� Language�Changes�のひとつ 最新の情報は�https://bugs.ruby- lang.org�などをご参照ください ✓ ✓ [2015.11.06追記]�まだ議論 中の内容を取り扱っており、記 法など変わる可能性があります ✓
  5. 5. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 2.3.0-dev
  6. 6. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 Safe�navigation� operator obj.?foo�という呼び出し⽅ で、Active�Support�の�try!� に似た振る舞いをする obj.try!�{}�相当のブロック付き呼び 出しはできないなど違いはある ✓ ✓ .�のバリエーションとして の�.?�と捉えると良さそう ✓
  7. 7. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 Other�Languages Groovy�や�Swift,�C#�6.0�に相 当の機能があるらしい�(風聞) ✓ 他の⾔語の�?.�と�.?�は似てい る? ✓ Ruby�ではメソッド名の最後 に�?�を付けられるため�?.�は使 えず�?. 他の⾔語と逆なので注意✓ ✓
  8. 8. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 どう書く? 上がActive�Supportのtry!で、 下がSafe�navigation�operator ✓ ������������������ ������������
  9. 9. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 Railsむかし話 Safe�navigation�operator�の 振る舞いは�try!�の⽅に似てる Rails�4�で�try�の動きが変わって� try!�が導⼊されている ✓ Rails�3�の�try�をアンラーニングさ れず�(?)�、名残りで�try�を使ってい るコードをちらほら ✓ ✓
  10. 10. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 try�と�try!�(Rails�3) try!�メソッドはそもそも存在せず ��������������� ����������� ������������������������������� ������ �������������������������������� ��������������������������������������������������������������������� �������������������������������� ������������������������������������������������������� ��������������������������������� ������������������������������������������������������
  11. 11. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 try�と�try!�(Rails�4) try�メソッドの振る舞いは変わる ��������������� ���������� ������������������������������� ������ �������������������������������� ������ �������������������������������� ������ ��������������������������������� ���������������������������������������������������������������������
  12. 12. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 Safe�navigation� operator Rails�3�の�try�あるいは�Rails�4� の�try!�に似た感じになる �������������� ���������� �������������������������� ������ ��������������������������� ���������������������������������������������������������������������
  13. 13. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 Active�Support�による� try�のおさらい Rails�4�での�Active�Support� のコードを⾒てみましょう ✓
  14. 14. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 Rails�4�での�try�の実装 ��������������� �������������������������������������������������� ���
  15. 15. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 try�の実装を⾒て 条件に⼀致しない場合は�nil�が 返る。つまり�respond̲to?�に 反応するメソッドがなければ� nil�が返る ✓ つまりレシーバに対応するメソ ッドがあってもなくても動く ✓ それを期待していることはあま りないのでは? ✓
  16. 16. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 Rails�4�での�try!�の実装 ���������������� ����������������������������� �������������������� ����������������������� �������� ���������������� ������� ������ ����������������������� ����� ���
  17. 17. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 try!�の実装を⾒て try�と異なり�respond̲to?�は ⾒ていないので、メソッドがな ければエラーになる ✓
  18. 18. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 あれ?(⼀瞬分からなくなる) try!�はレシーバに存在しないメ ソッド呼び出しをしたらエラー になる ✓ nil�への対応のはずなのに、nil� にないメソッドを呼んだらエラ ーになるよね? ✓
  19. 19. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 Method#source̲locatio n�を使った解析 メソッドの定義場所が違うらしい ����������������������������������� ���������������������������������������������������� ���������������������������������� ����������������������������������������������������
  20. 20. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 nil�専用の�try�実装 try.rb�にレシーバ�nil�専用の振る舞 いがある �������������� ���������������� ������� ����� ����������������� ������� ����� ���
  21. 21. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 まとめ 上がActive�Supportのtry!で、 下がSafe�navigation�operator ✓ ������������������ ������������
  22. 22. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 考えられる移⾏ 期待しているメソッドが存在し ている前提で戻り値が�nil�の場 合を想定しているケースにおい て、大体の場合は�try�ではな く�try!�が良さそう ✓ obj.try!(:foo)�で良い場所は� obj.?foo�に置き換えてけそう ✓
  23. 23. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 Safe�navigation� operator�を試してみよう �����������������������
  24. 24. try!�から�.?�へ�(#11537) Powered�by�Rabbit�2.1.8 To�be�continued... https://bugs.ruby-lang.org/ issues/11537 ✓ https://github.com/ruby/ ruby ✓ https://github.com/rails/ rails ✓

×