🐕

【Ruby学習記録】オブジェクトのクラスとメソッドの調べ方

2022/09/02に公開

お題1:文字リテラル "Hello!" のクラス名を出力せよ

q1.rb
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にある、小文字に変換するためのメソッドを調べて使ってね、というお題。

q3.rb
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 のように、ターミナル機能も備えている環境であれば、同じ画面内で操作が完結するのが有難かったりする。

GitHubで編集を提案

Discussion