Ruby

基本構文

Ruby

変数・型・制御フロー・メソッド

変数と型

ローカル・インスタンス・クラス・グローバル変数と基本型

variables.rb 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・ループ

control.rb ruby
# 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

メソッド

引数・デフォルト値・キーワード引数・返り値

methods.rb ruby
# 基本メソッド(最後の式が返り値)
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))