こちらの記事にコメントを残されていた方のrubyのメソッド定義を見つける方法がかなり楽だったので共有させていただきます。
pry
gemを入れてるのが前提です。
? reciever.method
=> メソッドのドキュメント表示
map
はc言語で実装されてるらしい
[1] pry(main)> ? [1,2,3].map
From: array.c (C Method):
Owner: Array
Visibility: public
Signature: map()
Number of lines: 9
Invokes block once for each element of self. Creates a
new array containing the values returned by the block.
See also Enumerable#collect.
If no block is given, an enumerator is returned instead.
a = [ "a", "b", "c", "d" ]
a.collect {|x| x + "!" } #=> ["a!", "b!", "c!", "d!"]
a #=> ["a", "b", "c", "d"]
presence
は便利メソッドがいっぱいあるgemactivesupport
で定義されている。
説明もわかりやすい。
[2] pry(main)> ? "".presence
From: /$HOME/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activesupport-5.1.4/lib/active_support/core_ext/object/blank.rb @ line 27:
Owner: Object
Visibility: public
Signature: presence()
Number of lines: 16
Returns the receiver if it's present otherwise returns nil.
object.presence is equivalent to
object.present? ? object : nil
For example, something like
state = params[:state] if params[:state].present?
country = params[:country] if params[:country].present?
region = state || country || 'US'
becomes
region = params[:state].presence || params[:country].presence || 'US'
return [Object]
$ reciever.method
=> メソッドのソースコード表示
さっき見た通りc言語で実装されているmap
メソッド
[3] pry(main)> $ [1,2,3].map
From: array.c (C Method):
Owner: Array
Visibility: public
Number of lines: 13
static VALUE
rb_ary_collect(VALUE ary)
{
long i;
VALUE collect;
RETURN_ENUMERATOR(ary, 0, 0);
collect = rb_ary_new2(RARRAY_LEN(ary));
for (i = 0; i < RARRAY_LEN(ary); i++) {
rb_ary_push(collect, rb_yield(RARRAY_PTR(ary)[i]));
}
return collect;
}
presence
もしっかり定義されている
[4] pry(main)> $ "".presence
From: /$HOME/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activesupport-5.1.4/lib/active_support/core_ext/object/blank.rb @ line 43:
Owner: Object
Visibility: public
Number of lines: 3
def presence
self if present?
end