基本構文
Ruby
変数・型・制御フロー・メソッド
変数と型
ローカル・インスタンス・クラス・グローバル変数と基本型
# 変数の種類
local_var = 'ローカル変数(小文字またはアンダースコア開始)'
@instance = 'インスタンス変数'
@@class_var = 'クラス変数'
$global = 'グローバル変数(非推奨)'
CONSTANT = '定数(大文字開始)'
# 基本型
num = 42
float = 3.14
str = 'hello'
bool_t = true
bool_f = false
nothing = nil
sym = :symbol
# 型確認
42.class # Integer
3.14.class # Float
'hi'.class # String
:sym.class # Symbol
[].class # Array
{}.class # Hash
true.class # TrueClass
nil.class # NilClass
42.is_a?(Integer) # true
42.is_a?(Numeric) # true(継承関係も確認)
42.kind_of?(Float) # false
42.respond_to?(:to_s) # true
# 多重代入
a, b, c = 1, 2, 3
first, *rest = [1, 2, 3, 4] # first=1, rest=[2,3,4]
*init, last = [1, 2, 3, 4] # init=[1,2,3], last=4
a, b = b, a # スワップ制御フロー
if・unless・case・while・until・ループ
# if / elsif / else
x = 10
if x > 0
puts '正'
elsif x == 0
puts 'ゼロ'
else
puts '負'
end
# unless(if not)
unless x.nil?
puts '値あり'
end
# 後置 if / unless(1行の場合)
puts '偶数' if x.even?
puts '奇数' unless x.even?
# 三項演算子
result = x > 0 ? '正' : '非正'
# case / when
status = 200
message = case status
when 200 then 'OK'
when 301, 302 then 'Redirect'
when 400..499 then 'Client Error'
when 500..599 then 'Server Error'
else 'Unknown'
end
# case with pattern matching(Ruby 3+)
case { name: 'Alice', role: 'admin' }
in { name: String => name, role: 'admin' }
puts "管理者: #{name}"
in { name: String => name }
puts "ユーザー: #{name}"
end
# ループ
5.times { |i| print "#{i} " } # 0 1 2 3 4
1.upto(5) { |i| print "#{i} " } # 1 2 3 4 5
5.downto(1){ |i| print "#{i} " } # 5 4 3 2 1
1.step(10, 2) { |i| print "#{i} " } # 1 3 5 7 9
# while / until
i = 0
while i < 5
i += 1
end
until i == 10
i += 1
end
# loop(無限ループ)
loop do
break if condition_met?
endメソッド
引数・デフォルト値・キーワード引数・返り値
# 基本メソッド(最後の式が返り値)
def add(a, b)
a + b # returnは省略可
end
# デフォルト引数
def greet(name, greeting = 'こんにちは')
"#{greeting}、#{name}!"
end
# キーワード引数(Ruby 2.0+)
def connect(host:, port: 3000, ssl: false)
"#{ssl ? 'https' : 'http'}://#{host}:#{port}"
end
connect(host: 'localhost')
connect(host: 'example.com', port: 443, ssl: true)
# スプラット演算子
def sum(*numbers) # 可変長引数
numbers.sum
end
sum(1, 2, 3, 4) # 10
def config(name, **options) # キーワード可変長引数
options.each { |k, v| puts "#{k}: #{v}" }
end
config('app', debug: true, env: 'prod')
# 疑問符メソッド・感嘆符メソッド
'hello'.empty? # false(慣例: boolean を返す)
[3,1,2].sort! # 破壊的変更(慣例: レシーバを変更)
# &.(safe navigation operator)
user&.name # user が nil でも NoMethodError にならない
user&.address&.city
# method object
m = method(:puts)
m.call('hello') # puts 'hello'
[1,2,3].each(&method(:puts))