Guest User

Untitled

a guest
Nov 20th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. #! ruby -Ks
  2. # -*- coding: Shift_JIS -*-
  3.  
  4. =begin
  5. Object#tap
  6. 存在は知っていたけど、どんなシーンで使えるのかよくわからなくて使ったこと無かったんですが・・・
  7. むしろ、あらゆるシーンで使えるメソッドでした。
  8.  
  9. まず、1.8.7から増えたとはいうものの、未実装verでも簡単に定義できます。
  10.  
  11. class Object
  12. def tap
  13. yield self
  14. self
  15. end
  16. end
  17.  
  18. これだけ
  19. ブロック引数に自身を渡し、返り値も自身とする
  20. これによって破壊的操作やデバッグを使いやすくし(メソッドチェーンの友)、多くのシーンで変数や返り値の宣言を減らしてくれます。
  21. =end
  22.  
  23. tmp1 = [1, 2, 1]
  24.  
  25. puts '------------------'
  26.  
  27. p tmp1.uniq
  28. p tmp1.uniq!
  29.  
  30. puts '------------------'
  31.  
  32. #重複削られた後の配列が返りましたよね?
  33. #これは、通常特に問題にならん動作でしょう
  34. #問題なのは・・・
  35.  
  36. p tmp1.uniq!
  37.  
  38. puts '------------------'
  39.  
  40. #往々にしてruby標準の破壊的メソッドは、操作対象の無かった場合にnilを返します。
  41. #きっと意味がある(或いは使わせたくない)んでしょうが、メソッドチェーン時には使いづらい挙動でもあります。(最初のうちよく引っかかりました。)
  42. #こんなシーンでも、tapを使えば返り値がselfとなることを保証してくれます。
  43.  
  44. p tmp1.tap{|o|o.uniq!}
  45.  
  46. puts '------------------'
  47.  
  48. #ただまぁ、個人的にはメソッドが増えた割にコードの意味が分かりやすくなっていないので、よっぽど軽量化考えてるわけでもないなら非破壊のuniqを使いたいんですけど・・・
  49. #とりあえず、tapの使いどころはこれだけじゃありませんでした。
  50.  
  51. %w(Cofee Cocoa CCLemon CDE).collect{|str|str.sub('C','c')}.select{|str|/o/ =~ str}.each do |str|
  52. puts str
  53. end
  54.  
  55. puts '------------------'
  56.  
  57. #こんな感じでメソッドチェーンを使ってるときに、途中経過を確かめたくなったとします。
  58. #そういう時、フツーのやり方だと
  59.  
  60. after_sub_strings = %w(Cofee Cocoa CCLemon CDE).collect{|str|str.sub('C','c')}
  61. p after_sub_strings
  62. after_sub_strings.select{|str|/o/ =~ str}.each do |str|
  63. puts str
  64. end
  65.  
  66. puts '------------------'
  67.  
  68. #こうやって、一度ばらしてやらなきゃいけません。
  69. #そこでtap
  70.  
  71. %w(Cofee Cocoa CCLemon CDE).collect{|str|str.sub('C','c')}.tap{|now|p now}.select{|str|/o/ =~ str}.each do |str|
  72. puts str
  73. end
  74.  
  75. puts '------------------'
  76.  
  77. #必ずしも破壊的に使う必要はないわけですね
  78. #これならチェーン途中の流れを簡単に確かめられるし、不要になってもそこだけ外せば済みます。
  79. #脱着御免のリピータかまして、パケットキャプチャをやってるようなイメージ。
  80. #tapっていうメソッド名の由来は「盗聴」からみたいなことみかけた気がするんですが、それはおそらくこういう用途を指したんじゃないでしょうか
Add Comment
Please, Sign In to add comment