Rubyの基礎(1)値やデータの扱い

taka updated at 2019/04/01


まったくの初心者がプログラミングを始めるにあたって、何からやったらいいのか、どう進めたらいいのか、そんなゼロからスタートする人に向けて、書いていきます。


言語はRubyを使います。環境はMacがいいですね。新しいMacは買ったときからすでにRubyが入っています。Rubyにはコード実行を対話で行うコマンドirbがあります。とりあえずMacのターミナルを開いて、irbを実行してみてください。

$ irb
irb(main):001:0> 

>という表示の次にRubyのコードを書くことで、Rubyに触れていきます。


★Rubyの値は全てオブジェクト
Rubyでは整数・浮動小数点数・文字列・配列・連想配列・true・false・nil など、扱うデータ・値はすべてオブジェクトになります。
この意味は、例えば他の言語javaでは、データ・値はプリミティブ型と言われる基本データ型とオブジェクト型の2種類が存在し、整数・浮動小数点数、真偽値などboolean、char、byte、short、int、long、float、doubleはプリミティブ型で、オブジェクトではないのです。
Rubyはシンプルさを強調する言語だということです。


irbで確認してみましょう。

# 整数
irb> 1.class
=> Fixnum・・・Ruby2.4からは整数はIntegerクラスとして扱うことに変更された

# 浮動小数点数 
irb> 1.0.class 
=> Float

# 文字列
irb> "abc".class 
=> String

# 配列
irb> [1, 2, 3].class 
=> Array

# 連想配列
irb> {"key" => "value"}.class 
=> Hash

# true
irb> true.class 
=> TrueClass

# false
irb> false.class 
=> FalseClass

# nil(他言語でいう nullの表記) 
irb> nil.class
=> NilClass

各値のオブジェクトのclassというメソッドを呼んでいます。メソッドとは関数と同義で、オブジェクトに対しメソッドという処理を呼んで使います。classメソッドはクラスを返す処理です。呼び出しは「オブジェクト.メソッド」というようにピリオド(.)をつけて呼び出します。なおメソッドの最後に.class()と小括弧をつけてもいいのですが、Rubyでは省略できるので単に.classとなっています。
このオブジェクトに対するメソッド呼び出しがプログラミングの基本の形です。このメソッド呼び出しの集合がプログラムになります。



例えば 1.next は整数の加算を行うメソッドで次のような呼び出しができます。
irb> 2.next
=> 3
Rubyは加算 1 + 1 の + ですらメソッドです。(これは 1.+(1) のシンタックスシュガーです)配列参照 ary[0] の [] もメソッドです。(arr.[](0) のシンタックスシュガーです)配列代入 ary[0] = 1 の []= もメソッドです。(arr.[]=(0, 1) のシンタックスシュガーです)
シンタックスシュガーとは、プログラミング言語の読み書きのしやすさのために、既に存在する構文に別の記法を与えたものです。


Stringオブジェクトでは、

irb> "abc" + "d" 
=> "abcd"
irb> "12" * 2 
=> "1212"
irb> "abc".upcase 
=> "ABC"
irb> "abc".next
=> "abd"・・これは辞書的に文字列を進めていきます。abdの次はabe。abzの次はacaです。
irb> "abc".next.upcase.reverse 
=> "DBA"


ちなみにmethodsで対象のオブジェクトの全メソッドを確認できます。

irb> 1.methods
=> [:%, :&, :*, :+, :-, :/, :<, :>, :^, :|, :~, :-@, :**, :<=>, :<<, :>>, :<=, :>=, :==, :===, :[], :inspect, :size, :succ, :to_s, :to_f, :div, :divmod, :fdiv, :modulo, :abs, :magnitude, :zero?, :odd?, :even?, :bit_ length, :to_int, :to_i, :next, :upto, :chr, :ord, :integer?, :floor, :ceil, :round, :truncate, :downto , :times, :pred, :to_r, :numerator, :denominator, :rationalize, :gcd, :lcm, :gcdlcm, :
+@, :eql?, :singleton_method_added, :coerce, :i, :remainder, :real?, :nonzero?, :step, :positi ve?, :negative?, :quo, :arg, :rectangular, :rect, :polar, :real, :imaginary, :imag, :abs2, :angle, : phase, :conjugate, :conj, :to_c, :between?, :a, :check, :xx, :instance_of?, :public_send, :inst ance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance _variable, :private_methods, :kind_of?, :instance_variables, :tap, :method, :public_method, :singleton_method, :is_a?, :extend, :define_singleton_method, :to_enum, :enum_for, :=~, :! ~, :respond_to?, :freeze, :object_id, :display, :send, :nil?, :hash, :class, :singleton_class, :clo ne, :dup, :itself, :taint, :tainted?, :untaint, :untrust, :trust, :untrusted?, :methods, :protecte d_methods, :frozen?, :public_methods, :singleton_methods, :!, :!
=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]

Arrayオブジェクトでは、

irb> ary = [1, 2, 3] 
=> [1, 2, 3]
irb> ary[0] 
=> 1
irb> ary[1] 
=> 2
irb> ary[2] 
=> 3
irb> ary[-1]
=> 3 ・・・ -nは後ろからn番目の要素を参照する
irb> ary[4]
=> nil ・・・ 範囲外の要素を参照してもエラーにならない
irb> ary[9] = 10 
=> 10
irb> ary
=> [1, 2, 3, nil, nil, nil, nil, nil, nil, 10] ・・・ 歯抜けの要素は nil で埋められる

Hashオブジェクト(連想配列)では、大括弧{ } を使い、

irb> hash = {"key" => "value"} 
=> {"key" => "value"}
irb> hash["key"] 
=> "value"
irb> hash["hoge"]
=> nil ・・・ 未定義のキーで参照してもエラーにならない
irb> hash["foo"] = "bar" 
=> "bar"
irb> hash
=> {"key" => "value", "foo" => "bar"}

というようにRubyではすべての値やデータはオブジェクトですので、何かするときはメソッドを呼び出すわけです。


★Rubyの変数「宣言」は型なし

Rubyには明示的な変数宣言の構文はありません。型宣言もありません。単に、「変数名 = 10」という代入のコードで変数が使えるようになります。

irb> i = 10 
=> 10

型宣言がないので、続けて次のように整数のつもりの変数に文字列を入れてもエラーにならないです。これは代入の実行が、変数を宣言してその変数をオブジェクトに初期化する意味になっていて、Rubyの変数は常にいつでも初期化できるのです。

irb> i = "10" 
=> "10"