Rubyでポートフォリオを作る傍で、
Rubyの基礎と往復している際に印象に残った
Rubyの書き方やルールについてまとめます。
あくまでも自分用に、随時更新で。
変数はスネークケースで書く
.rb
special_price = 200
式展開を使用する場合は ” ” ダブルクォート
.rb
puts "#{special_price}"
文字列の中でシングル(ダブル)クォートを使う場合
.rb
puts "\"Hello\""
# => "Hello"
数値の_は無視される
.rb
1_000_000_000
# => 1000000000
整数同士の割り算は解も整数
.rb
1 / 2 #=>0
1.0 / 2 #=>0.5
++は構文としては無効
.rb
n += 1 #=>2
n *= 3 #=>6
n /= 2 #=>3
n **= 2 #=>9
有理数
.rb
0.1 * 3.0 == 0.3 #=>false
0.1 * 3.0 <= 0.3 #=>false
Rationalクラスを使うと少数でなく3/10
.rb
0.1r * 3.0r #=>(3/10)
&&は||より優先
.rb
if文は最後に評価された式を戻り値とする
.rb
greeting =
if
elsif
else
end
if thenでコードを1行化できる
.rb
if (処理) then (戻り値)
%記法
.rb
%q!! #=> ' '
%Q!! #=> " "
%!! #=> " "
ヒアドキュメント
.rb
a = <<TEXT
文字列
TEXT
フォーマット文字列
.rb
'%0.3f' % 1.2 #=>"1.200"
指数表現
.rb
2e-3 #=> 0.002
# 2×10^-3
条件演算子(三項演算子)
.rb
message = n > 10 ? 'true' : 'false'
GC(ガベージコレクション)
使用されなくなったオブジェクトを回収し、
自動的にメモリ解放する
.rb
エイリアスメソッド
名前が異なるだけで同じ実装のメソッド
.rb
dvimodは商と余りを配列で返す
.rb
14.divmod(3) #=> [4,2]
ブロック引数は不要なら省略
.rb
numbers.each do
sum += 1
end
ブロック内にrubyのコードを書ける
.rb
numbers = [1,2,3,4]
sum = 0
numbers.each do |number|
sum_value = n.even? ? n * 10 : n #条件演算子
sum += sum_value #sum_valueはブロック内のみ有効
end
sum #=> 64
ちなみに、プロが書くと、こんなに簡潔に、、、!!!
@scivolaさん、勉強になります。
.rb
numbers = [1,2,3,4]
sum = numbers.sum{ |n| n.even? ? n * 10 : n }
参考:Array#sum (Ruby 2.7.0 リファレンスマニュアル)
配列の要素を評価して戻り値を新しい配列にする
numbers = [1,2,3,4]
new_numbers = numbers.map { |n| n * 10 }
new_numbers #=> [10,20,30,40]
たたみ込み演算を行うメソッド
numbers = [1,2,3,4]
sum = numbers.inject(0) { |result, n| result + n }
# 1回目 result=>0, n=>1, 0+1=1
# 2回目 result=>1, n=>2, 1+2=3
sum #=> 10
&:メソッドでさらに簡潔に
[1,2,3,4].select { |n| n.odd? } #=> [1,3]
[1,2,3,4].select(&:odd?) #=> [1,3]
# 1.ブロック引数が一つだけの時
# 2.メソッドに引数を持たない時
# 3.ブロック引数に対してメソッドが1文の時 の可
# &:演算子はダメ
Rangeは文字列にも使える
('a'...'e').to_a #=>["a","b","c","d"] ...は末尾入らない
数字の桁数を指定する
'0'.rjust(5) #=> " 0"
'0'.rjust(5, '0') #=> "00000"
配列の末尾を取得する
a = [1,2,3]
a[-1] #=> 3
配列の要素の置き換え
a = [1,2,3,4,5]
a[1,3] = 100
# => [1,100,5] んなバカな...
配列の和差積の集合
a = [1,2,3]
b = [3,4,5]
a | b #=> [1,2,3,4,5]
a - b #=> [1,2]
a & b #=> [3]
多重代入で残りの全要素を配列として受け取る
e, f = 100, 200, 300
e #=> 100
f #=> 200
e, *f = 100, 200, 300
e #=> 100
f #=> [200, 300]
配列を合成する
a = [1,2]
b = [3,4]
a.push(b) #=> [1,2,[3,4]]
a.push(*b) #=> [1,2,3,4]
%記法で文字列の配列を簡潔に作る
['apple', 'melon', 'orange']
# => ['apple', 'melon', 'orange']
%W!apple melon orange!
%W(apple melon orange)
%W(
apple
melon
orange
)
配列の初期値
a = Array.new(5, 'nil')
# =>[nil, nil, nil, nil, nil]
a = Array.new(5){'default'}
# =>["default", "default", "default", "default", "default"]
# =>要素は全てちがうオブジェクト
joinで配列を連結させる
names = ['佐藤', '田中', '浜辺']
honorific = names.map{ |name| "#{name}さん"}
honorific.join('と') #=>"佐藤さんと田中さんと浜辺さん"
catchとthrowで大域脱出
last_names = ['佐藤', '田中', '浜辺']
first_names = ['太郎', '次郎', '美波']
catch :myfavorite do
last_names.shuffle.each do |last_name|
first_names.shuffle.each do |first_name|
puts "#{last_name} #{first_name}さん"
if last_name == "浜辺" && first_name == "美波"
throw :myfavorite #シンボル
end
end
end
end