目次
Rubyを使った効率的なスクリプトの書き方を紹介
Rubyの基本的なコンテナオブジェクトには配列とハッシュがあり、ともにオブジェクトへの参照を格納します。
ここでは配列についてみてみます。Rubyの配列はPerlの無名配列と似ています。
sample.rb
str = "This is a string."
num = 0
array = [num,1,2,str]
str[-1] = '?'
num = 999
array.each do |var|
puts var
end
出力例
$ ruby sample.rb
0
1
2
This is a string?
strを更新、つまりarrayの第3要素の参照先を間接的に更新したことで、ピリオド'.'がクエスチョンマーク'?'に変更されて出力されました。
一方でnumに新しいオブジェクトを代入しても、これまでnumに代入してあったオブジェクト自体を更新したことにはならないため0は0のままです。
配列へのアクセス
sample.rb
array = [0,1,2,3,4,5,6,7,8,9]
p array[2,3]
p array[2..4]
出力例
$ ruby sample.rb
[2, 3, 4]
[2, 3, 4]
配列への代入
sample.rb
array = [0,1,2]
array[10] = 9 # 残りはnilで埋まります。
p array
array[3..10] = nil,nil # [3],...,[10]がnil,nilで置換されます。
p array
array[3,2] = 'a','b','c','d' # [3],[4],[5]がa,b,c,dで置換されます。
p array
出力例
$ ruby sample.rb
[0, 1, 2, nil, nil, nil, nil, nil, nil, nil, 9]
[0, 1, 2, nil, nil]
[0, 1, 2, "a", "b", "c", "d"]
比較
配列の比較は全要素が等しい場合にtrueとなります。
sample.rb
a = [1,2,'a']
b = [1,2,'a']
puts "a == b" if a==b
出力例
$ ruby sample.rb
a == b
便利なメソッド
Arrayオブジェクトの便利なメソッドを示します。
sample.rb
array = [1,2,3]
p array.size
p array.length
array *= 3
p array
p array.include? 2
p array.sort
p array.uniq
p array # もとの配列はそのまま
array.sort! # '!': 配列を破壊的に操作
p array
array.uniq!
p array
# 結合して文字列生成
expression = array.join(' + ')
# inject(初期値), 配列をイテレート, subtotal: 前回ループの結果または初期値, val: 配列要素
total = array.inject(0){|subtotal, val| subtotal+val}
puts "#{expression} = #{total}"
# push,pop,unshift,shift
array = ['middle']
array.push 456
array.unshift 123
p array
p array.pop
p array
p array.shift
p array
出力例
3
3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
true
[1, 1, 1, 2, 2, 2, 3, 3, 3]
[1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
[1, 1, 1, 2, 2, 2, 3, 3, 3]
[1, 2, 3]
1 + 2 + 3 = 6
[123, "middle", 456]
456
[123, "middle"]
123
["middle"]
イテレータ
sample.rb
array = [1,2,3]
array.each do |val|
puts val
end
array.each_with_index do |val,i|
puts "#{i}: #{val}"
end
出力例
$ ruby sample.rb
1
2
3
0: 1
1: 2
2: 3
全要素を一度に操作
Perlなどにもあるmapが実装されています。
sample.rb
array = [1,2,3]
p array.map{|val| val*2}
出力例
$ ruby sample.rb
[2, 4, 6]
メソッドを一つ呼ぶだけのシンプルなケースであればショートカット記法があります。
sample.rb
array = [1,2,3]
p array.map{|val| val.class}
p array.map(&:class)
出力例
$ ruby sample.rb
[Fixnum, Fixnum, Fixnum]
[Fixnum, Fixnum, Fixnum]
抽出
Perlなどにおけるgrepに相当するselectが実装されています。
sample.rb
array = [1,2,3,4,5]
p array.select{|val| val%2==0}
出力例
$ ruby sample.rb
[2, 4]
ソートをもっと詳しく
何をもとに評価してソートするかを記述できます。
sample.rb
array = [['a',100],['c',200],['b',50]]
p array.sort{|x,y| x[1] <=> y[1]}
p array.sort{|x,y| x[0] <=> y[0]}
出力例
$ ruby sample.rb
[["b", 50], ["a", 100], ["c", 200]]
[["a", 100], ["b", 50], ["c", 200]]
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- レイアウトおよび部分テンプレートに関するまとめ (Rails4)レイアウトおよび部分テンプレートはどちらもテンプレート (*.html.erb) に共通の要素をまとめておき、任意のテンプレートから利用できるようにしておくための仕組みです。フッターやヘッダーといった大枠はレイアウト、小さなパーツは部分テンプレートというイメージで使い分けましょう。 レイアウトの使用方法 クラス毎に指定する方法と、アクション毎に指定する方法があります。 app/views/layo...
- Ruby コードスニペット (正規表現)sample.rb str = "001: This is a string." var1,var2 = 2,3 # 'EOS'とすると#{}による変数展開がなされない (%03dは展開される) doc = (<<"EOS" % var1) # 括弧は省略可。要は<<"EOS"の次の行からEOSまで。(参: <<-"EOS"とすると前に空白...
- OAuthを用いずにTwitterに自動投稿する (回数制限あり, Selenium with Ruby)Seleniumを用いて、OAuthを用いずにTwitterに自動投稿するRubyスクリプトを記述してみます。連続で複数回実行すると、ボット判定としてキャプチャ認証が発生します。その認証までは通過できませんので悪しからず。また、Twitterの仕様変更次第ではDOMの構造が変化するため、下記サンプルは機能しなくなる恐れが有ります。 twitter_post.rb #!/usr/bin/ruby r...
- Ruby における日本語のエンコーディング日本語を含めて多言語対応する際には、Asciiコード以外の文字コードセットが必要になります。日本語が主となる場合、よく使われる文字セットにはUnicode, Shift_JIS, EUC-JPがあります。このうち Unicode だけは特殊であり、世界中のあらゆる文字を収録しようとしていることから 1 文字を表現するために必要なバイト数が大きくなってしまっています。そのため Unicode のうち...
- Rails3ビューテンプレートの基本的な使用方法 (Ruby)Railsでは、ERB (eRuby (テキストファイルにRubyスクリプトを埋込む書式の仕様) をRubyで実装したもの) を用いてHTML内にRubyスクリプトを埋込むことができます。 <% %> で囲むと出力されません (if-elseなど制御構文を記述します) <%= %> で囲むとエスケープ出力されます <%== %> で囲むとエスケープされずに...