型変換の理解が甘かった話

f:id:ryoutaku_jo:20190108185339p:plain
【結論】

  • getsで取得した値には、末尾に改行(\n)が付与される
  • 末尾に「\n」が付いた文字列を「to_sym」で型変換すると、

 「:”apple\n”」という様に、文字列を「””」で囲ってから、
 頭に「:」するという処理を行う

  • これにより、同じ文字のシンボルオブジェクトと等式を組んでも、

 falseで返って来てしまう。


【目次】

【本題】

前回のあらすじ

詳しくは、こちらを参照
ryoutaku-jo.hatenablog.com


とあるRubyのプログラミング 問題を解く中で、
同じ値(文字)で、同じデータ型(シンボル型)なのに、
等式でfalseが返ってくるという謎の事態に遭遇。

※下記がそのコード

fruits = {apple: '200', banana: '100' ,orange: '300'}
fruits_name = fruits.keys

input = gets.to_sym

fruits_name.each do |fruit|
  if fruit == input
  puts fruits[fruit]
  end
end


色々調べるうちに、周辺知識に詳しくなるも原因は分からず、
結局、翌日に持ち越すことに・・・

単純な話だった・・・

Irbで、コードを個別に動かしたところ、原因が判明した


f:id:ryoutaku_jo:20190108184624p:plain

ん??
「\n」って、もしかして









これだ!!!!






どうやら、「to_sym」では、
getsで取得した文字列を型変換しても、
改行は残ってしまう
様です。

完全に盲点・・・



改行を取り除く処理を加えたら、上手くいきました!

fruits = {apple: '200', banana: '100' ,orange: '300'}
fruits_name = fruits.keys

input = gets.chomp
input = input.to_sym

fruits_name.each do |fruit|
  if fruit == input
  puts fruits[fruit]
  end
end

「to_i」では、getsに対して型変換した場合、改行されないので、
「to_sym」も当然改行が入らないと思い込んでいました・・・


「to_i」は数値への変換ですが、数値では「””」は使えないので、
「””」が無いと機能しない「\n」は、消えるのでしょうね。

対して「to_sym」は、「:”apple\n”」という様に、「””」の外側に
「:」を追加すれば、「””」を残したまま、シンボルオブジェクトとして機能するので、
「””」が必要な「\n」も、そのまま残るのでしょう。(無理やり納得)



型変換とは


ちなみに型変換とは、Wikiでは下記の様に説明されています。

型変換とはプログラムにおいて、
あるデータ型を他のデータ型に変換することである。
型キャストとも呼ばれる

分類
暗黙の型変換は、明示的に指定しなくてもコンパイラの判断によって
自動的に行われる型変換である。
逆に、明示的に指定して行う型変換を明示的型変換という。

ja.wikipedia.org



今回の様に「to_sym」などのメソッドを用いて、
オブジェクトの型を変えるのは、明示的型変換に当たりますね。

Rubyの場合、組み込みライブラリに含まれているString・Symbol・Integerなどの
クラスが型変換のメソッド(.to_i、to_s、to_symなど)を持っています。

docs.ruby-lang.org


とりあえず今日はこんなところです。
Rubyは簡単な言語と言われてますけど、まだまだ未知の領域だらけで、
極めるための道のりは長そうで、これから楽しみです。


《今日の学習進捗》
Rubyの面白そうな本を購入したので、そちらばかり読む。
Vimが難しい・・・

学習開始からの期間 :32日
今日までの合計時間:293.0h
今日までに到達すべき目標時間:292.0h
目標との解離:+0.8h