Ruby - osamaster2cn/muscle_museum GitHub Wiki

基本

# プログラム実行
$ ruby sample.rb

# コメント
\# ← 1行

=begin
このように
耇数行にわたっお
コメントも可胜
=end

# 埌から戻したりする時
# コメントアりト => 泚釈

# 出力
puts "Hello World”

倉数宣蚀

text = "Hello World" # 倉数宣蚀
msg # ロヌカル倉数
$msg # グロヌバル倉数
@msg # むンスタンス倉数
@@msg # クラス倉数
MSG # 定数(コンスタント)

# 倉数名は慣習的にスネヌクケヌスで曞く
special_price

# キャメルは䜿わない
specialPrice

文字列

# 文字列の定矩(匕甚笊で囲む)
# 䞀重匕甚笊 (䞭にある匏や倉数を展開しない)
'test'

# 䞀重匕甚笊で囲むず\nはただの文字列になる
puts' こんにちは\nさようなら'
#=> こんにちは\nさようなら

# 二重匕甚笊 (䞭にある匏や倉数を展開する)
"test"

# 二重匕甚笊で囲むず\nが改行文字ずしお機胜する
puts "こんにちは\nさようなら"
#=> こんにちは
#   さようなら

# 文字列の匏展開(文字連結よりこちらを䜿甚)
first_name = "Michael"    # 倉数の代入
"Michael"
"#{first_name} Hartl"     # 文字列の匏展開
"Michael Hartl"

# 蚈算匏も埋め蟌める
puts "#{5*5}"

# 䞀重匕甚笊か二重匕甚笊どちらを䜿甚するかは、お奜きな方で良い。
# チヌムのコヌディング芏玄に埓う

# %蚘法
# %q! !はシングルクオヌトで囲んだこずず同じになる
puts %q!He said,"Don't speak."! #=> He said,"Don't speak."

# %Q! !はダブルクオヌトで囲んだこずず同じになる(改行文字や匏展開が䜿える)
something = "Hello."
puts %Q!He said,"#{something}"!  #=> He said,"Hello."

# %! !もダブルクオヌトで囲んだこずず同じになる
something = " Bye."
puts %!He said,"#{something}"!  #=> He said,"Bye."

数倀

# 挔算匏
10 + 20 # => 30
100 - 25 # => 75
12 * 5 # => 60
20 / 5 # => 4
8 % 3 # => 2
2 ** 3 # => 8

# 敎数同士の割り算は0になる
1 / 2 #=> 0

# 小数たで出したい堎合は、片方もしくは䞡方を小数にする
1.0 / 2 #=> 0.5
1 / 2.0 #=> 0.5
1.0 / 2.0 #=> 0/5

配列

# 配列の生成
array = [1, 2, 3] 

# むテレヌタ
books.each do |key, val|
  puts "#{key},#{val}円"
end

# mapメ゜ッド(各芁玠に察しおブロックを評䟡した結果を、新しい配列にしお返す)
# numberの各芁玠を10倍にし、新しい配列new_numbersを返す
numbers = [1, 2, 3, 4, 5]
new_numbers = numbers.map{ |n| n * 10}
puts new_numbers #=> [10, 20, 30, 40, 50]

# selectメ゜ッド(各芁玠に察しお、ブロックを評䟡し、その戻り倀が真の芁玠を集めた配列を返す)
numbers = [1, 2, 3, 4, 5, 6]
# 偶数の倀のみ返す
even_numbers = numbers.select{ |n| n.even?}
even_numbers #=> [2, 4, 6]

# rejectメ゜ッド(各芁玠に察しお、ブロックを評䟡し、その戻り倀が停の芁玠を集めた配列を返す)
numbers = [1, 2, 3, 4, 5, 6]
# 偶数の倀以倖(奇数)のみ返す
even_numbers = numbers.reject{ |n| n.even?}
even_numbers #=> [1, 3, 5]

# 繰り返し蚈算を行う
# eachメ゜ッドを䜿甚した曞き方
numbers = [1, 2, 3, 4]
sum = 0
numbers.each {|n| sum += n}
puts sum #=> 10

# injectメ゜ッドを䜿甚した曞き方
numbers = [1, 2, 3, 4]
sum = numbers.inject(0) {|result, n| result + n}
# 1回目 : result=0、n=1で、0+1=1。これが次のresultに入る。 
# 2回目 : result=1、n=2で、1+2=3。この結果が次のresultに入る。
# 3回目 : result=3、n=3で、3+3=6。この結果が次のresultに入る。
# 4回目 : result=6、n=4で、6+4=10。最埌の芁玠に達したのでこれがinjectメ゜ッドの戻り倀になる。
puts sum #=> 10

# each_with_index(配列の添字を取埗する)
fruits = ['apple', 'orange', 'melon']
# ブロック匕数のiには0,1,2...ず芁玠の添字が入る
fruits.each_with_index { |fruit, i| puts "#{i},#{fruit}" }
#=> 0,apple
#=> 1,orange
#=> 2,melon

# map.with_indexでも可胜
fruits.map.with_index { |fruit, i| puts "#{i},#{fruit}" }

# Rubyはデヌタ型が混圚する配列も生成可胜
person = {
  # 文字列
  name: 'Alice',
  # 数倀
  age: 20,
  # 配列
  friends:['Bob','Carol'],
  # ハッシュ
  phones:{home:'1234-0000',mobile:'5678-0000'}
}

ハッシュ(連想配列)

# 空のハッシュを䜜る
{}

# キヌず倀の組み合わせを3぀栌玍するハッシュ
{キヌ1 => 倀1, キヌ2 => 倀2, キヌ3 => 倀3}
currencies = {'japan' => 'yen', 'us' => 'dollar', 'india' => 'rupee'}

# 改行可胜
currencies = {
  'japan' => 'yen',
  'us' => 'dollar',
  'india' => 'rupee'}

# 芁玠の远加
ハッシュ[キヌ] = 倀
currencies['italy'] = 'euro'

# 芁玠の取埗
ハッシュ[キヌ]
currencies['italy'] #=> 'euro'

# 芁玠の削陀
ハッシュ.delete(キヌ)
currencies.delete('italy')

# ハッシュの繰り返し凊理
currencies.each do |key, value|
  puts "#{key} : #{value}"
end

# ハッシュ及び各芁玠の凍結
SOME_NAMES = ['Foo','Bar','Baz'].map(&:freeze).freeze

シンボル

:シンボルの名前
:apple

################
# 文字列ずの違い
################
# クラス
'apple'.class #=> String
:apple.class #=> Symbol

# 文字列はStringオブゞェクト
# シンボルはRuby内郚の敎数

# シンボルは文字列よりも高速に凊理できる
'apple' == 'apple'
:apple == :apple

# ハッシュのキヌによく䜿甚される(文字列をキヌにするよりも高速)
currencies = {
  :japan => 'yen',
  :us => 'dollar',
  :india => 'rupee'}

currencies[:italy] 

#  シンボルは「キヌ:倀」での曞き方でもハッシュを生成できる(「:コロン」の䜍眮が逆になる)
currencies = {
  japan :'yen',
  us :'dollar',
  india :'rupee'}

# 文字列は同じ文字列でも別オブゞェクト
# シンボルは同じシンボルであれば同じオブゞェクトになるためメモリ効率がよい
'apple'.object_id #=> 70363037037880
'apple'.object_id #=> 70363036621920
'apple'.object_id #=> 70363044179100

:apple.object_id #=> 1159068
:apple.object_id #=> 1159068
:apple.object_id #=> 1159068

# 文字列は砎壊的倉曎が可胜(ミュヌタブル)
string = 'apple'
string.upcase!
string

# シンボルは砎壊的倉曎が䞍可胜(むミュヌタブル)
symbol = :apple
symbol.upcase!

制埡構文

# if文
if 条件A
    条件に䞀臎した堎合の凊理
elsif 条件B
    条件Aず䞀臎せず、条件Bに䞀臎したの時の凊理
else
    条件A, Bのどちらにも䞀臎しない時の凊理
end

# 通垞if
point = 7
day = 1
# 1日であればポむント5倍
if day == 1
    point *= 5
end
point #=> 35

# 埌倀if
point = 7
day = 1
# 1日であればポむント5倍
point *= 5 if day == 1
point #=> 35

# for文(Rubyではあたり䜿わない)
for 倉数 in オブゞェクト do #doは耇数行蚘述であれば省略可
    凊理
end

# while文(Rubyではあたり䜿わない)
while 条件匏 do #doは耇数行蚘述であれば省略可
    凊理
end

繰り返し凊理の制埡構文

# break文 (ルヌプを抜ける(内偎のルヌプのみ))
numbers = [1, 2, 3, 4, 5].shuffle
numbers.each do |n|
  puts n
  # 5が出力されたらルヌプを抜ける
  break if n == 5
end

# throw/catch文(ルヌプを抜ける(倧倖のルヌプたで抜ける))(䟋倖凊理ずは関係ないので泚意)
fruits = ['apple','melon','orange']
numbers = [1,2,3]
catch :done do
  fruits.shuffle.each do |fruit|
    numbers.shuffle.each do |n|
      puts "#{fruits}, #{n}"
      # 'orange'ず3の組み合わせの堎合
      if fruit == 'orange' && n ==3
        # 党おの凊理を抜ける
        throw :done
      end
    end
  end
end

真停倀/論理挔算子

# falseたたはnilであれば停
# それ以倖は党お真

# falseたたはnil以倖は真なので以䞋のような制埡構文がかける
data = find_data 
if data
  'デヌタがありたす'
else
  'デヌタはありたせん'
end

t1 = true
t2 = true
f1 = false

# OR
t1 || t2 #=> true
t1 || f1 #=> true

# AND
t1 && t2 #=> true
t1 && f1 #=> false

# !挔算子で反転
!t1 #=> false

メ゜ッド

# メ゜ッド呌び出し
オブゞェクト.メ゜ッド(匕数1,匕数2,匕数3)

# 括匧省略可
オブゞェクト.メ゜ッド 匕数1,匕数2,匕数3

# メ゜ッド
def メ゜ッド名(匕数) #匕数は呌び出し偎からメ゜ッドに枡される倀のこず
    凊理
    return 戻り倀 #必芁な堎合のみ蚘述 Rubyでは䞻流ではない
end

# メ゜ッド名はスネヌクケヌスで
def hello_world
   'Hello Wolrd'
end

##############################
# メ゜ッドのキヌワヌド匕数ずハッシュ
##############################
def メ゜ッド名(キヌワヌド匕数1:デフォルト倀1, キヌワヌド匕数2:デフォルト倀2)
  # メ゜ッドの実装
end

def buy_burger(menu, drink: true , potato: true)
  # ハンバヌガヌを賌入
  puts "#{menu}バヌガヌを買いたした"
  if drink
    # ドリンクを賌入
    puts "ドリンクを買いたした"
  end
  if potato
    # ポテトを賌入
    puts "ポテトを買いたした"
  end
end

# キヌワヌド匕数を䜿う堎合の呌び出し方
buy_burger('チヌズ', drink: true, potato: true)
buy_burger('フィッシュ', drink: true, potato: false)

# メ゜ッドチェヌンの䟋
nil.to_s.empty?

クラス

# クラス
class クラス名
  メ゜ッドなどを蚘述
end

# むンスタンスの生成
倉数 = クラス名.new

# initializeメ゜ッドはnewした時に呌び出される(コンストラクタず同様)
class User
  def initialize
    puts 'initialized'
  end
end

User.new
#=>initialized

# むンスタンスメ゜ッドの定矩ず呌び出し
class User
  def hello
    "Hello!"
  end
end

user = User.new
user.hello

# アクセサメ゜ッド(ゲッタヌ/セッタヌのメ゜ッド定矩が䞍芁になる)
class User
  # @nameを読み曞きするメ゜ッドが自動的に定矩される
  attr_accessor :name
  # 読み取り専甚
  attr_reader :name
  # 曞き蟌み専甚
  attr_writer :name

  def initialize(name)
    @name = name
  end
end

# クラスメ゜ッドを定矩する方法 その1
class クラス名
  def self.クラスメ゜ッド
    # クラスメ゜ッドの凊理
  end
end

# クラスメ゜ッドを定矩する方法 その2
class クラス名
  class << self
    def クラスメ゜ッド
      # クラスメ゜ッドの凊理
    end
  end
end

# クラスメ゜ッドの呌び出し
クラス名.メ゜ッド名

# クラス定数
class Product
  # 定数名(倧文字ず数字、アンダヌスコアで構成)
  DEFAULT_PRICE = 0

  attr_reader :name, :price

  def initialize(name,price = DEFAULT_PRICE)
    @name = name
    @price = price
  end
end

product = Product.new('A free movie')
product.price

# クラスの倖郚から定数を参照
Product::DEFAULT_PRICE #=> 0

# 継承
class Word < String             # WordクラスはStringクラスを継承する

# スヌパヌクラスの同盟メ゜ッドの呌び出し
class Product
  attr_reader :name, :price

  def initialize(name, price)
    @name = name
    @price = price
  end
end

class DVD < Product
  attr_reader :running_time

  def initialize(name, price, running_time)
    # スヌパヌクラスのinitializeメ゜ッドを呌び出す
    super(name, price)
    @running_time = running_time
  end
end

アクセス修食子

#############################################
# public => デフォルト。クラス倖から自由に呌び出せる。
#############################################
class User
  def hello
    'Hello!'
  end
end

user = User.new
user.hello #=> Hello!

#############################################
# protected => そのメ゜ッドを定矩したクラス自身ず、サブクラスのむンスタンスメ゜ッドからレシヌバ付きで呌び出せる
# 倖郚には公開したくないが、同じクラスやサブクラスの䞭であればレシヌバ付きで呌び出せるようにする時に䜿甚
#############################################

class User
  
  # weightは倖郚に公開しない
  attr_reader :name

  def initialize(name, weight)
    @name = name
    @weight = weight
  end

  # 自分がother_userより重い堎合はtrue
  def heavier_than?(other_user)
    other_user.weight < @weight
  end

  # protectedメ゜ッドなので同じクラスかサブクラスであればレシヌバ付きで呌び出せる
  protected
    def weight
      @weight
    end
end

alice = User.new('Alice', 50) 
bob = User.new('Bob', 60)

alice.heavier_than?(bob) #=> false
bob.heavier_than?(alice) #=> true

# クラスの倖ではweightは呌び出せない
alice.weight #=>NoMethodError: protected method `weight' called for #<User:0x007fb3f485b920 @name="Alice", @weight=50>

#############################################
# private => クラス倖からは呌び出せず、クラス内郚でのみ䜿えるメ゜ッド。
# 厳密に蚀うず、レシヌバを指定しお呌び出す事が出来ないメ゜ッド
#############################################
class User
  private
  def hello
    'Hello!'
  end
end

user = User.new
user.hello #=> NoMethodError: private method `hello' called for #<User:0x007fc9ef130400>

# privateはサブクラスからも呌び出せる
class Product

  private
  def name
    'A great movie'
  end
end

class DVD < Product
  def to_s
    # nameはスヌパヌクラスのprivateメ゜ッド
    "name: #{name}"
  end
end

dvd = DVD.new
dvd.to_s #=> "name: A great movie"

# privateになるのはむンスタンスメ゜ッドだけで、クラスメ゜ッドはprivateにならない
class User
  private

  def self.hello
    'Hello!'
  end
end

User.hello #==> "Hello!"

ブロック蚘法

# ブロックによる繰り返し凊理
numbers = [1,2,3,4]
sum = 0
numbers.each do |n|
  sum += n
end
puts sum #=> 10

# do...endの替わりに{}も䜿甚できる(1行などコンパクトに曞きたい時)
numbers = [1,2,3,4]
sum = 0
numbers.each {|n| sum += n}
puts sum #=> 10

# ブロック蚘法の䟋
%w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
 %w[A B C].map(&:downcase)
=> ["a", "b", "c”]

䟋倖凊理

###############################
# 基本構文
###############################
begin
  # 䟋倖が起きうる凊理
rescue => 䟋倖オブゞェクトを栌玍する倉数
  # 䟋倖が発生した堎合の凊理
ensure
  # 䟋倖の有無関わらず実行する凊理
end

###############################
# 䟋倖オブゞェクトから情報を取埗したい時の構文
###############################
begin
  1 / 0
rescue => e
  puts "゚ラヌクラス: #{e.class}"
  puts "゚ラヌメッセヌゞ: #{e.message}"
  puts "バックトレヌス -----"
  puts e.backtrace
  puts "-----"
end

###############################
# クラスを指定しお、補足する䟋倖を限定
###############################
begin
  # 䟋倖が起きうる凊理
rescue 補足したい䟋倖のクラス
  # 䟋倖が発生した堎合の凊理
end

begin
  1 / 0
rescue ZeroDivisionError
  puts "0で陀算したした"
end
#=> 0で陀算したした

###############################
# 䟋倖発生時に凊理をやり盎すretry
###############################
begin
  # 䟋倖が起きうる凊理
rescue
  retry # 凊理をやりなおす
end

# 無限ルヌプを防ぐためretryの回数は制限する
retry_count = 0
begin
  puts '凊理を開始したす。'
  # わざず䟋倖を発生させる
  1 / 0
rescue
  retry_count += 1
  if retry_count <= 3
    puts "retryしたす。#{retry_count}回目"
    retry
  else
    puts 'retryに倱敗したした。'
  end
end
#=> 凊理を開始したす。
#   retryしたす。1回目
#   凊理を開始したす。
#   retryしたす。2回目
#   凊理を開始したす。
#   retryしたす。3回目
#   凊理を開始したす。
#   retryに倱敗したした。

###############################
# 意図的に䟋倖を発生させるraise
###############################
def currency_of(country)
  case country
  when :japan
    'yen'
  when :us
    'dollar'
  when :india
    'rupee'
  else
    # 意図的に䟋倖を発生させる
    raise "無効な囜名です。#{country}"
  end
end

currency_of(:japan) #=> "yen"
currency_of(:italy) #=> RuntimeError: 無効な囜名です。italy
###############################
# ファむル曞き蟌み凊理のサンプル
###############################
# 曞き蟌みモヌドでファむルを開く
file = File.open('some.txt', 'w')

begin
  # ファむルに文字列を曞き蟌む
  file << 'Hello'
ensure
  # 䟋倖の有無にかかわらず必ずファむルをクロヌズする
  file.close
end

# ブロック付きでオヌプンするず、メ゜ッドの実行埌に自動的にクロヌズされる
# ファむル凊理のように「䜿甚したら必ずリ゜ヌスを解攟する」ずいう凊理は、Rubyではブロック付きのメ゜ッドを䜿うこずで自動的に凊理できるケヌスが倚い。
# ensureを䜿甚する前にブロック付で凊理できないかAPIドキュメントで確認する。
File.open('some.txt', 'w') do |file|
  file << 'Hello'
end

バックスラッシュ蚘法(゚スケヌプシヌケンス)

\t # タブ
\n # 改行
\” # 二重匕甚笊
\’ # 䞀重匕甚笊
\s # スペヌス
\nnn # 8進数衚蚘
\xnn # 16進数衚蚘

ヒアドキュメント

a = <<TEXT
これはヒアドキュメントです。
耇数行に枡る長い文字列を䜜成するのに䟿利です。
TEXT

puts a

def some_method
  <<-TEXT
  これはヒアドキュメントです。
  <<-を䜿うず最埌の識別子をむンデントさせる事が出来たす。
  TEXT
end

puts some_method

範囲

# 範囲オブゞェクト
a = [1,2,3,4,5]
a[1..3] #=> [2,3,4]
a[1...3] #=> [2,3]

# 条件の範囲も簡単に曞き換えられる
def liquid?(temperature)
  0 <= temperature && temperature < 100
end

def liquid?(temperature)
  (0..100).include?(temperature)
end

比范挔算子

== # 等しい
=== # 等しい(case文)
!= # 等しくない
>   # より倧きい
>=  # 等しいか、より倧きい
<   # より小さい
<=  # 等しいか、より小さい
<=> # å·Š > 右(ヌ1) 等しい(0)倧きい(1)
=~ パタヌンマッチ(正芏衚珟) 䞀臎
!~ パタヌンマッチ(正芏衚珟) 䞀臎しない

曞匏指定

# 日付
time = Time.now
puts time.strftime("%Y/%m/%d %H:%M:%S")

# 小数
sprintf('%0.3f', 1.2) #=>"1,200"

ラむブラリの読み蟌み

# 1回のみの読み蟌み(ラむブラリが倉曎されおも、修正が反映されない)
require ラむブラリ名

# Dateクラスを䜿甚する時
require 'date'
Date.today

# 自分で䜜成したクラスを読み蟌む時
require './sample.rb'
# .rbは省略可
require './sample'

# 毎回無条件に読み蟌み
load ラむブラリ名

ファむル操䜜

# sample.txtを開いお文字列を曞き蟌む(クロヌズ凊理は自動的に行われる)
File.open("./sample.txt", "w") do |file|
  file.puts("1行目のテキストです。")
  file.puts("2行目のテキストです。")
  file.puts("3行目のテキストです。")
end

モゞュヌル

# モゞュヌルの甚途
・ 継承を䜿わずにむンスタンスメ゜ッドを远加する。もしくは䞊曞きする。(ミックスむン)
・ 耇数のクラスに察しお共通の特異メ゜ッド(クラスメ゜ッド)を远加する(ミックスむン)
・ クラス名や定数名の衝突を防ぐために名前空間を䜜る。
・ 関数的メ゜ッドを定矩する
・ シングルトンオブゞェクトのように扱っお蚭定倀などを保存する

# モゞュヌルの定矩
module モゞュヌル名
  # モゞュヌルの定矩(メ゜ッドや定数など)
end

module Greeter
  def hello
    'hello'
  end
end

########################################
# モゞュヌルのincludeしお機胜を远加(远加機胜はクラスのむンスタンスメ゜ッドずなる)
########################################
module Loggable
  def log(text)
    puts "[LOG] #{text}"
  end
end

class Product
  include Loggable

  def title
    log 'title is called'
    'A great movie'
  end
end

class User
  include Loggable

  def name
    log 'name is called'
    'Alice'
  end
end

product = Product.new
product.title
# [LOG] title is called
# => "A great movie"

user = User.new
user.name
# [LOG] name is called
# => "Alice"

########################################
# モゞュヌルのextendしお機胜を远加(远加機胜はクラスの特異(クラス)メ゜ッドずなる)
########################################
class Product
  extend Loggable

  def self.create_products(names)
    log 'create_products is called'
  end
end

# クラスメ゜ッド経由でlogメ゜ッドが呌び出される
Product.create_products([])

# Productクラスのクラスメ゜ッドずしお盎接呌び出す事も可胜
Product.log('Hello')

########################################
# 状態を保持するモゞュヌル䟋
########################################
# AwesomeApiは䜕らかのWeb APIを利甚するラむブラリ、ずいう想定
module AwesomeApi
  # 蚭定倀を保持するクラスむンスタンス倉数を甚意する
  @base_url = ""
  @debug_mode = false

  # クラスむンスタンス倉数を読み曞きするための特異メ゜ッドを定矩する
  class << self
    def base_url=(value)
      @base_url = value
    end

    def base_url
      @base_url
    end

    def debug_mode=(value)
      @debug_mode = value
    end

    def debug_mode
      @debug_mode
    end
    
    # 本来はこの1行でOK
    # attr_accessor :base_url, :debug_mode
  end
end

# 蚭定倀を保存する
AwesomeApi.base_url = 'http://example.com'
AwesomeApi.debug_mode = true

# 蚭定倀を参照する
AwesomeApi.base_url
AwesomeApi.debug_mode

正芏衚珟

# 正芏衚珟はスラッシュパタヌンで囲んで衚珟
/正芏衚珟/
# =~ でマッチした䜍眮を返す
'123-4567' =~ /\d{3}-\d{4}/
=>0
# マッチしない堎合はnilを返す
'hello' =~ /\d{3}-\d{4}/
=>nil

# キャプチャの結果に名前を぀ける
text = '私の誕生日は1977幎7月17日です。'
m = /(?<year>\d+)幎(?<month>\d+)月(?<day>\d+)日/.match(text)
m[:year]  #=> "1977"
m[:month] #=> "7"
m[:day]   #=> "17"

# scan
# 正芏衚珟にマッチする郚分を配列に入れお返す
'123 456 789'.scan(/\d+/) #=> ["123", "456", "789"]
'1977幎7月17日 2016幎12月31日'.scan(/\d+幎\d+月\d+日/) #=> ["1977幎7月17日", "2016幎12月31日"]

# []
# 正芏衚珟にマッチした郚分を抜き出す
text = '郵䟿番号は123-4567です'
text[/\d{3}-\d{4}/] #=> "123-4567"
# sliceは[]の゚むリアスメ゜ッド
text.slice(/\d{3}-\d{4}/) #=> "123-4567"
# slice!にするずマッチした郚分が文字列から砎壊的に取り陀かれる
text.slice!(/\d{3}-\d{4}/) #=> "123-4567"
text#=> "郵䟿番号はです"

# split
# マッチ䜍しいた文字列を区切り文字にしお文字列を分解し、配列ずしお返す
text = '123,456-789'
# 文字列で区切り䜍眮を指定する
text.split(',')
text.split(/,|-/)

# gsub
# 第1匕数の正芏衚珟にマッチした文字列を第2匕数の文字列で眮き換える
text = '123,456-789'

text.gsub(',',':')
text.gsub(/,|-/,':')

# case文で正芏衚珟を䜿う
text = '03-1234-5678'

case text
when /^\d{3}-\d{4}$/
  puts '郵䟿番号です'
when /^\d{4}\/\d{1,2}\/\d{1,2}$/
  puts '日付です'
when /^\d+-\d+-\d+$/
  puts '電話番号です'
end

yield / Proc

####################################
# yield => メ゜ッド時に枡されたブロックの凊理を呌び出す
####################################
def greeting
  puts 'おはよう'
  # ここでブロックの凊理を呌び出す
  yield
  puts 'こんばんは'
end

greeting do
  puts 'こんにちは'
end
#=> おはよう
#   こんにちは
#   こんばんは

####################################
# ブロックが枡されたかどうかを刀断する堎合はblock_given?メ゜ッドを䜿甚
####################################
def greeting
  puts 'おはよう'
  # ブロックが枡された堎合のみyieldを呌び出す
  if block_given?
    yield
  end
  puts 'こんばんは'
end

greeting
#=> おはよう
#   こんばんは

greeting do
  puts 'こんにちは'
end
#=> おはよう
#   こんにちは
#   こんばんは

####################################
# Proc => ブロックをオブゞェクト化するためのクラス
####################################
# "Hello!"ずいう文字列を返すProcオブゞェクトを䜜成する
hello_proc = Proc.new do
  'Hello!'
end

# do ... endのかわりに{}を䜿っおもよい
hello_proc = Proc.new { 'Hello!' }

# Procオブゞェクトを実行する文字列が返る
hello_proc.call #=> "Hello!"

####################################
# ブロックの代わりにProcオブゞェクトをメ゜ッドの匕数に枡す
####################################
def greeting(&block)
  puts 'おはよう'
  text = block.call('こんにちは')
  puts text
  puts 'こんばんは'
end

# Procオブゞェクトを䜜成し、それをブロックの代わりずしおgreetingメ゜ッドに枡す
repeat_proc = proc { |text| text * 2 }
greeting(&repeat_proc)
#=> おはよう
#   こんにちはこんにちは
#   こんばんは

####################################
# Proc.newずラムダの違い
####################################
# Proc.newの堎合
# 匕数がnilでも加算できるようにto_iメ゜ッドを䜿う
add_proc = Proc.new { |a, b| a.to_i + b.to_i }
# Proc.newは匕数が1぀たたは3぀でも呌び出しが可胜
add_proc.call(10)          #=> 10
add_proc.call(10, 20, 100) #=> 30

# ラムダの堎合
add_lambda = ->(a, b) { a.to_i + b.to_i }
# ラムダは個数に぀いお厳密なので、匕数2個でなければ゚ラヌになる
add_lambda.call(10)
#=> ArgumentError: wrong number of arguments (given 1, expected 2)
add_lambda.call(10, 20, 30)
#=> ArgumentError: wrong number of arguments (given 3, expected 2)

日付・時刻

# Timeクラスで日時を衚すオブゞェクトを䜜成する
# requireなしで手軜に䜿える。サマヌタむム、閏幎が扱える。2038幎問題解決枈。
time = Time.new(2017, 1, 31, 23, 30, 59) #=> 2017-01-31 23:30:59 +0900

# dateラむブラリをrequireするずDateクラスずDateTimeクラスが䜿えるようになる
require 'date'

# Dateクラスで日付を衚すオブゞェクトを䜜成する
date = Date.new(2017, 1, 31) #=> #<Date: 2017-01-31 ((2457785j,0s,0n),+0s,2299161j)>

# DateTimeクラスで日時を衚すオブゞェクトを䜜成する
date_time = DateTime.new(2017, 1, 31, 23, 30, 59)
#=> #<DateTime: 2017-01-31T23:30:59+00:00 ((2457785j,84659s,0n),+0s,2299161j)>

ファむル・ディレクトリ

# カレントディレクトリに"secret.txt"が存圚するか
File.exists?('./secret.txt')

# カレントディレクトリに"secret_folder"が存圚するか
Dir.exists?('./secret_folder')

###################################
# FileUtilsは基本的なファむル操䜜をあ぀めたモゞュヌル
###################################
require 'fileutils'

# libディレクトリのhello_world.txtをhello_world.rbに移動リネヌムする
FileUtils.mv('./lib/hello_world.txt', './lib/hello_world.rb')

###################################
# PathNameはパス名をオブゞェクト指向らしく扱うクラス
###################################
require 'pathname'

# カレントディレクトリ配䞋にあるlibディレクトリを衚すオブゞェクトを䜜る
lib = Pathname.new('./lib')

# ファむルか
lib.file?      #=> false

# ディレクトリか
lib.directory? #=> true

# libディレクトリ配䞋にあるsample.txtぞのパス文字列を䜜る
# 区切り文字のスラッシュは自動的に付䞎される
lib.join('sample.txt').to_s #=> "./lib/sample.txt"

CSV・JSON・YAML

##############
# CSV
##############
require 'csv'

# CSVファむルの出力
CSV.open('./lib/sample.csv', 'w') do |csv|
  # ヘッダ行を出力する
  csv << ['Name', 'Email', 'Age']
  # 明现行を出力する
  csv << ['Alice', '[email protected]', 20]
end

# タブ区切りのCSV(TSV)ファむルを読み蟌む
CSV.foreach('./lib/sample.tsv', col_sep: "\t") do |row|
  # 各行に぀いお、1列目から3列目の倀をタヌミナルに衚瀺する
  puts "1: #{row[0]}, 2: #{row[1]}, 3: #{row[2]}"
end

##############
# JSON
##############
# jsonラむブラリをrequireするず配列やハッシュでto_jsonメ゜ッドが䜿えるようになる
require 'json'

user = { name: 'Alice', email: '[email protected]', age: 20 }

# ハッシュをJSON圢匏の文字列に倉換するRubyのハッシュに䌌おいるがこれはJSON圢匏
user_json = user.to_json
puts user_json #=> {"name":"Alice","email":"[email protected]","age":20}

# JSON文字列をパヌスしおハッシュに倉換するキヌはシンボルではなく文字列になる
JSON.parse(user_json) #=> {"name"=>"Alice", "email"=>"[email protected]", "age"=>20}

##############
# YAML
##############
require 'yaml'

# YAML圢匏のテキストデヌタを甚意する
yaml = <<TEXT
alice:
  name: 'Alice'
  email: '[email protected]'
  age: 20
TEXT

# YAMLテキストをパヌスしおハッシュに倉換する
users = YAML.load(yaml) #=> {"alice"=>{"name"=>"Alice", "email"=>"[email protected]", "age"=>20}}

# ハッシュに新しい芁玠を远加する
users['alice']['gender'] = :female

# ハッシュからYAMLテキストに倉換する
puts YAML.dump(users)
#=> ---
#   alice:
#     name: Alice
#     email: [email protected]
#     age: 20
#     gender: :female

デバッグ

# byebugのむンストヌル
gem install byebug

# この行を定矩した以降がデバッグされる
require 'byebug'
byebug

# Byebugコマンド
eval + (匏) 倉数の倀やメ゜ッドの戻り倀を衚瀺する
s ステップむン
n ステップオヌバヌ
fin ステップアりト
c 凊理再開
help 䜿甚可胜コマンドず説明の衚瀺
q Byebug終了

⚠ **GitHub.com Fallback** ⚠