Rubyの多重代入

複数の変数に同時に値を代入する

a = 1
b = 2
c = 3
puts a
puts b
puts c
# 1
# 2
# 3

多重代入を使えば一行で同等の代入を実行することができる

a, b, c = 1,2,3
puts a
puts b
puts c
# 1
# 2
# 3

Rubyでrequireを使って外部ファイルを読み込む

Rubyではrequireを使えば外部ファイルを一つのファイルに取り込むことができる。まず自作メソッドを含んだファイルを作成する。

# method.rb
def example(num, str)
num.times do
puts str
end
end

それを実行ファイル内でrequireを使って読み込めば、そのファイル内にある自作メソッドが実行できる。

require "./method"
example(3, "Hello World")
puts "---"
example(2, "Hello World")
# Hello World
# Hello World
# Hello World
# ---
# Hello World
# Hello World

Rubyで自作メソッドを作成し共通処理を実行する

def METHODで自作メソッドを作成することができる。例えば任意の回数Hello worldを出力したい時は、下記のように自作メソッドにしておけば簡単に同じ処理を実行できる。

def example(num, str)
num.times do
puts str
end
end
example(3, "Hello World")
puts "---"
example(2, "Hello World")
# Hello World
# Hello World
# Hello World
# ---
# Hello World
# Hello World

Rubyのtimesとforで指定した回数のループを行う

Rubyでの指定した回数のループではtimesメソッドとfor文の2つの選択肢がある。

timesメソッドは指定した回数のループに特化している

3.times do |i|
puts i
end
# 0
# 1
# 2

for文は開始の数値から終了までの数値を指定してその範囲分だけループを行う。timesではループの中で取得できる数値は0から開始となっていたが、forを使えば取得できる数の開始値を設定できるという違いがある。

for i in 1..3
puts i
end
# 1
# 2
# 3

これと同じ処理をtimesメソッドを使って書くとこうなる

3.times do |i|
puts i + 1
end

変数を操作する必要があり、1から3の数値が欲しいという場面ではfor文を使うのが記述量が少なくて済むことが分かる

Rubyをコマンドラインから実行し外部から引数を受け取る

コマンドラインから引数を受け取るにはARGVを使う。まずこのようなファイルを作成して保存する。

# p_argb.rb
p ARGV

コンソールを開いてこのように引数を書いて実行すると受け取れていることを確認できる

ruby a_argb.rb "hello world" to 1000 times
["hello world", "to", "1000", "times"]

ポイントとして"で囲んだ文字列にはスペースが入ってもひとつの文字列として認識しているが、他のスペース区切りの文字列は別々の文字列として渡されている。
また、数値に関しても"で囲んでいなくても文字列として渡されている。したがって、数値を使った処理を行うプログラムを作成する時はこのようにARGVから受け取った後でstr.to_iを使って数値に変換すること。

# go_argv.rb
num = ARGV[0].to_i
while num > 1
puts num -= 1
sleep(1)
end
puts "Go"

Rubyでハッシュに要素を追加する

Rubyでハッシュに要素を追加するにはnames["str"]を使えば良い

names = {"Wakame" => 3, "Omochi" => 2, "Kaki" => 1}
p names
names["Ame"] = 1
names["Dango"] = 1
p names
# {"Wakame"=>3, "Omochi"=>2, "Kaki"=>1}
# {"Wakame"=>3, "Omochi"=>2, "Kaki"=>1, "Ame"=>1, "Dango"=>1}

シンボルならnames[:str]とすれば良い

names = {Wakame: 3, Omochi: 2, Kaki: 1}
p names
names[:Ame] = 1
names[:Dango] = 1
p names
# {:Wakame=>3, :Omochi=>2, :Kaki=>1}
# {:Wakame=>3, :Omochi=>2, :Kaki=>1, :Ame=>1, :Dango=>1}

Rubyで外部のWebサイトのコンテンツを取得する

Rubyで外部のWebサイトのコンテンツを取得するにはNet::HTTP.get_responseを利用する

require 'net/http'
require 'uri'
response = Net::HTTP.get_response(URI.parse("http://example.com"))
if response.code == "200"
puts response.body
end

response.coderesponse.bodyといったインスタンスメソッドにはbody, entity, code, header, response, http_version, message, valueがあり、これらはRubyのリファレンスを参考にする。
class Net::HTTPResponse

ヘッダ情報のcache-controlなど取得できる情報は下記の通りである

require 'net/http'
require 'uri'
response = Net::HTTP.get_response(URI.parse("http://example.com"))
response.each do |key,r|
puts "response['#{key}']"
end
# response['accept-ranges']
# response['cache-control']
# response['content-type']
# response['date']
# response['etag']
# response['expires']
# response['last-modified']
# response['server']
# response['x-cache']
# response['x-ec-custom-error']
# response['content-length']

Rubyで第NのX曜日を取得する

Rubyで第4日曜日の取得を行うといった処理をどう記述するか。方法は色々とあると思うが、曜日ごとのハッシュに順に日を格納して取り出すという地道な方法で書いてみた。

require "Date"
require "Time"
year = 2014
month = 9
weeks = {0 => [], 1 => [], 2 => [], 3 => [], 4 => [], 5 => [], 6 => []}
last_day = Date.new(year, month , -1).mday
last_day.times do |d|
date = Time.parse("#{year}-#{month}-#{d+1}")
weeks[date.wday.to_i] << d + 1
end
p weeks
# {
#   "0"=>[7, 14, 21, 28],
#   "1"=>[1, 8, 15, 22, 29],
#   "2"=>[2, 9, 16, 23, 30],
#   "3"=>[3, 10, 17, 24],
#   "4"=>[4, 11, 18, 25],
#   "5"=>[5, 12, 19, 26],
#   "6"=>[6, 13, 20, 27]
# }
# 第4日曜日
puts weeks[0][3] unless weeks[0][3].nil?
# 第2水曜日
puts weeks[3][1] unless weeks[3][1].nil?
# 第1土曜日
puts weeks[6][0] unless weeks[6][0].nil?