【Ruby学習記録】オブジェクトのクラスとメソッドの調べ方
お題1:文字リテラル "Hello!" のクラス名を出力せよ
puts "Hello".class
===
% ruby q1.rb
String
Rubyでは、すべてのオブジェクトに"class"というメソッドがあって、そのインスタンスのクラス名を知ることが出来る。
class というメソッドの戻り値として、クラス名が返ってくる仕掛けになっているので、何かクラスによって処理を分岐したい場合なんかに使えそう。
# 変数 var には何が入っているのか分からない状態
if var.class == String
# Stringクラスだった場合の処理
else
# Stringクラスじゃなかった場合の処理
end
お題2:Integer クラスのメソッドをターミナルで確認せよ
ターミナルで "pry" を立ち上げて、ls コマンドで確認。
下記の例では"ls 0"としているが、0でなくても、Integerクラスのインスタンスとして認識できる値だったらなんでもOK。
[1] pry(main)> ls 0
Comparable#methods: between? clamp
Numeric#methods:
+@ angle clone conjugate eql? i imaginary negative? phase positive? pretty_print_cycle real rect singleton_method_added to_c
abs2 arg conj dup finite? imag infinite? nonzero? polar pretty_print quo real? rectangular step zero?
Integer#methods:
% ** -@ << == >= ^ anybits? chr digits downto floor inspect magnitude nobits? ord rationalize size to_f to_r upto
& + / <= === >> abs bit_length coerce div even? gcd integer? modulo numerator pow remainder succ to_i to_s |
* - < <=> > [] allbits? ceil denominator divmod fdiv gcdlcm lcm next odd? pred round times to_int truncate ~
最近の他の言語がどうなのか知らないが、言語の機能としてこのような機能があるのって相当ありがたい。
もちろん、各メソッドの詳しい使い方は公式のリファレンスを見ることになるんだが、リファレンスを見に行く前段階である程度アタリを付けられるのは有能。
なお、"ls Integer"とすると、違う出力が出てくる。
[1] pry(main)> ls Integer
constants: GMP_VERSION
Object.methods: yaml_tag
Integer.methods: sqrt
Integer#methods:
% ** -@ << == >= ^ anybits? chr digits downto floor inspect magnitude nobits? ord rationalize size to_f to_r upto
& + / <= === >> abs bit_length coerce div even? gcd integer? modulo numerator pow remainder succ to_i to_s |
* - < <=> > [] allbits? ceil denominator divmod fdiv gcdlcm lcm next odd? pred round times to_int truncate ~
クラス名とインスタンスで何か扱いが変わっているんだろうというところまでは想像できるが...この違いは何なんだろう?
お題3:"HELLO WORLD"をすべて小文字に変換して出力せよ
要は、Stringにある、小文字に変換するためのメソッドを調べて使ってね、というお題。
puts "HELLO WORLD".downcase
===
% ruby q3.rb
hello world
これも、pry を使って ls “” としておけば、以下のようにStringクラスのメソッド一覧が得られる。
Comparable#methods: < <= > >= between? clamp
String#methods:
% []= chars delete each_codepoint getbyte length partition scan squeeze swapcase! tr_s!
* ascii_only? chomp delete! each_grapheme_cluster grapheme_clusters lines prepend scrub squeeze! to_c undump
+ b chomp! delete_prefix each_line gsub ljust pretty_print scrub! start_with? to_f unicode_normalize
+@ bytes chop delete_prefix! empty? gsub! lstrip replace setbyte strip to_i unicode_normalize!
-@ bytesize chop! delete_suffix encode hash lstrip! reverse shell_split strip! to_r unicode_normalized?
<< byteslice chr delete_suffix! encode! hex match reverse! shellescape sub to_s unpack
<=> capitalize clear downcase encoding include? match? rindex shellsplit sub! to_str unpack1
== capitalize! codepoints downcase! end_with? index next rjust size succ to_sym upcase
=== casecmp concat dump eql? insert next! rpartition slice succ! tr upcase!
=~ casecmp? count each_byte force_encoding inspect oct rstrip slice! sum tr! upto
[] center crypt each_char freeze intern ord rstrip! split swapcase tr_s valid_encoding?
そこからは、英単語の意味をもとに見当を付けていけば、"up"とか"down"という単語が出てくるから、up/downが大文字/小文字のことか?という風に絞り込んでいけば良い。
こうやって探していくと、"upcase"ですべて大文字、"downcase"ですべて小文字、というのがセットで覚えられるようになる。
さらに似たような名前で探っていくと、同じ”case”という単語を使っているもので、”swapcase”というのも見つかる。
“swap”は交換という意味があるので、これは「大文字⇔小文字」の反転が出来そう、という風に関連付けてセットで覚えることも出来る。
もちろん、これは最初からリファレンスを見に行っても同じことは出来ると思うが、いちいちブラウザに切り替えて、検索なりブックマークたどるなりしなくても良いので、Visual Studio Code のように、ターミナル機能も備えている環境であれば、同じ画面内で操作が完結するのが有難かったりする。
Discussion