pandamanian’s diary

rubyとrailsについてアウトプットします!

『Ruby』配列について①

お疲れ様です!

今日はRubyの配列について記載します😊

配列の定義

配列の定義は非常に簡単です!

irb(main):065:0> a = ["apple0","apple1","apple2","apple3"]
=> ["apple0", "apple1", "apple2", "apple3"]

これで配列が定義出来ました!
ここではaと言う変数に配列を代入しています!
ではここで代入されたaと言う変数のクラスを確認して見ましょう!

irb(main):073:0> a.class
=> Array

Arrayと出ているので配列が定義されています!
配列はよく棚の様なものとして例えられる事が多いですね😊

じゃあ配列を定義して何が嬉しいのかですが。。。

それは1回定義してしまえば簡単にそのデータを取り出す事が出来ます😊

じゃあその取り出し方ですが

irb(main):066:0> a[0]
=> "apple0"
irb(main):067:0> a[1]
=> "apple1"
irb(main):068:0> a[2]
=> "apple2"
irb(main):069:0> a[3]
=> "apple3"
irb(main):070:0> 

この様に記述する事で何回でも取り出す事が出来ます😊

1回1回文字列で"apple"と入力するのって面倒ですからね。

ここで注目したいのはa[0]と言うオブジェクトのクラスは何でしょうか? 早速確認してみましょう!

irb(main):074:0> a[0].class
=> String

a[0]のクラスはstringになっていますね! つまりここではa[0]は文字列である"apple0"を参照しているんですね🤔

余談ですが文字列なので過去の記事でも紹介しました+メソッドが使えます!文字列連結が出来ます!

irb(main):075:0> a[0] + a[1]
=> "apple0apple1"
irb(main):076:0> a[1] + a[2]
=> "apple1apple2"
irb(main):077:0> a[2] + a[3]
=> "apple2apple3"
irb(main):078:0> 

それぞれの変数がなんのクラスに属しているかを把握するのは重要な事ですね!

a[0]は文字列であり、クラスはStringクラスでした。
じゃあ結局Stringクラスって何のメソッドが使えるの?って時はmethodsメソッドが使用出来ます!

irb(main):005:0> a[0].methods
=> [:encode, :encode!, :include?, :%, :*, :+, :count, :partition, :sum, :next, :to_c, :casecmp, :casecmp?, :insert, :bytesize, :match, :match?, :succ!, :<=>, :next!, :upto, :index, :replace, :==, :===, :chr, :=~, :rindex, :[], :[]=, :byteslice, :getbyte, :setbyte, :clear, :scrub, :empty?, :eql?, :-@, :downcase, :scrub!, :dump, :undump, :upcase, :+@, :capitalize, :swapcase, :upcase!, :downcase!, :capitalize!, :swapcase!, :hex, :oct, :freeze, :inspect, :bytes, :chars, :codepoints, :lines, :reverse, :reverse!, :concat, :split, :crypt, :ord, :length, :size, :grapheme_clusters, :succ, :start_with?, :center, :prepend, :strip, :rjust, :rstrip, :ljust, :chomp, :delete_suffix, :sub, :to_str, :to_sym, :intern, :sub!, :lstrip, :<<, :to_s, :to_i, :to_f, :gsub!, :chop!, :chomp!, :delete_prefix, :gsub, :chop, :end_with?, :scan, :tr, :strip!, :lstrip!, :rstrip!, :delete_prefix!, :delete_suffix!, :delete!, :tr_s, :delete, :squeeze, :tr!, :tr_s!, :each_grapheme_cluster, :squeeze!, :each_line, :each_byte, :each_char, :each_codepoint, :b, :slice, :slice!, :hash, :encoding, :force_encoding, :unicode_normalize, :valid_encoding?, :ascii_only?, :rpartition, :unicode_normalize!, :unicode_normalized?, :unpack, :unpack1, :to_r, :between?, :<=, :>=, :clamp, :<, :>, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :instance_variable_get, :instance_variable_set, :protected_methods, :instance_variables, :private_methods, :method, :public_method, :public_send, :singleton_method, :define_singleton_method, :extend, :to_enum, :enum_for, :!~, :respond_to?, :object_id, :send, :display, :class, :nil?, :dup, :singleton_class, :clone, :then, :itself, :yield_self, :untaint, :taint, :tainted?, :trust, :untrust, :untrusted?, :singleton_methods, :frozen?, :methods, :public_methods, :equal?, :!, :instance_exec, :!=, :instance_eval, :__id__, :__send__]

と沢山出てきてしまいました。。。
それだけ沢山のメソッドが使用できるって事ですね!

良く見ると過去記事で紹介した+メソッドがありますね😊 1.methodsとかやると-メソッドや%と言った数値に対して使えるメソッドが出てきます。

余談ではありますが、上記で出てきたメソッドはインスタンスメソッドです😇 メソッドは大別して
- インスタンスメソッド
- クラスメソッド

があるのですが後日アウトプットさせて頂きます!

とにかく配列は簡単に定義出来て簡単にデータが取得出来て便利ですね。

では何個か配列に対して使用出来る代表的なメソッドを使用してみます。


eachメソッド

ブロック引数に変数iを渡す事によって配列の要素を一つづつ取り出せます!

[1] pry(main)> a = ["apple0","apple1","apple2","apple3"]
=> ["apple0", "apple1", "apple2", "apple3"]
[2] pry(main)> a.each do |i|
[2] pry(main)*   puts i
[2] pry(main)* end  
apple0
apple1
apple2
apple3
=> ["apple0", "apple1", "apple2", "apple3"]


each_with_index

ブロック引数に引数を二つ渡す事によって要素と添字両方を取得する事が出来ます!

[5] pry(main)> a.each_with_index do |i,index|
[5] pry(main)*   puts "要素=#{i},添字=#{index}"  
[5] pry(main)* end  
要素=apple0,添字=0
要素=apple1,添字=1
要素=apple2,添字=2
要素=apple3,添字=3
=> ["apple0", "apple1", "apple2", "apple3"]

ブロックとは一言で言うと処理の塊です!
|i,index|の部分をブロック引数と呼びます。 ここでは下記の様にdo ~ endまでがブロックですね😊

do |i,index|
puts "要素=#{i},添字=#{index}"  
end  

ブロック引数に"i"と"index"という変数を渡して要素と添字を出力して下さいと命令しているんですね。
こういった処理を可能にしているのがeach_with_indexメソッドな訳です。

map

ブロック内で処理をした結果を配列で返します!
元の配列は変更しません!

[29] pry(main)> a.map do |i|
[29] pry(main)*   i + i
[29] pry(main)* end  
=> ["apple0apple0", "apple1apple1", "apple2apple2", "apple3apple3"]

[30] pry(main)> a
=> ["apple0", "apple1", "apple2", "apple3"]

元の要素を変更してしまいたい場合は

map!

を使用します。

[31] pry(main)> a.map! do |i|
[31] pry(main)*   i + i
[31] pry(main)* end  
=> ["apple0apple0", "apple1apple1", "apple2apple2", "apple3apple3"]

[33] pry(main)> a
=> ["apple0apple0", "apple1apple1", "apple2apple2", "apple3apple3"]

この様に元の要素を変更してしまうメソッドの事を
破壊的メソッド
と読んでいますね😊
名前のインパクトがすごいですよね笑

色んな破壊的メソッドがありますので興味があればググってみて下さい!

今回は配列についてアウトプットさせて頂きました!
ではでは学習頑張りましょう😊