Help us understand the problem. What is going on with this article?

Rubyのチートシート / メソッドと例外処理

More than 5 years have passed since last update.

ブログを更新しました。元の記事はコチラ


メソッドの基本的な書き方と例外処理。Railsチュートリアルを初めて読んだ時にcurrent_user=()みたいなメソッドがあって、え?てなったのを覚えてる…。

# ---------------------------------------------- #
# メソッド
# ---------------------------------------------- #

puts "\n\n############## Option Hash ##############\n\n"

# **BAD***
# 引数が何個必要なのか、どの場所にどの引数なのか混乱しやすい
# デフォルト値が設定されていない引数を渡し忘れるとエラーになる
def get_profile_bad(user_id, name, email, age = 0, gender = 'femal')
    puts user_id
    puts name
    puts email
    puts age
    puts gender
end

# **GOOD**
# 必須でない引数はハッシュで受け取るとスッキリ
# user_id以外の引数はオプションなので渡さなくてもエラーにはならない
def set_profile_good(user_id, options = {})
    puts "ID   : #{user_id}"
    puts "NAME : #{options[:name]}"
    puts "MAIL : #{options[:email]}"
    puts "AGE  : #{options[:age]}"
    puts "GEN  : #{options[:gender]}"
end


# 実行する時は改行して見やすく

puts "\n--- GOOD ---\n\n"

set_profile_good(14,
        name:   "my name here",
        email:  "email@email.com",
        age:    99,
        gender: "male"
)


# 結果は同じだけど読みづらい

puts "\n--- BAD ---\n\n"

set_profile_good(14, {name: "my name here", email: "email@email.com", age: 99, gender: "male"})


# optionsを渡さなくても実行可能

puts "\n--- options省略 ---\n\n"

set_profile_good(14)





puts "\n\n############## 特殊な記号 ##############\n\n"


# "*"がついた引数で、それ以降の引数を配列として受け取る
# ---------------------------------------------- #
puts "--- Splat Arguments ---\n\n"

def show_names(status, *names)
    puts "STATUS : #{status}\nNAME   : #{names.join(', ')}"
end

# "fine"以外はnamesに配列として格納される
show_names("fine", "sawada", "sakata", "suzuki", "saito")



# '!'や'?'と同じく,'='も特別な意味を持っているが強制するものではない
# '='は代入するという意味をもったメソッド
# ---------------------------------------------- #

puts "\n--- 'xx=' method  ---\n\n"

class User

    def initialize(name)
        @name = name
    end

    ### アクセサメソッドを自分で定義 ###
    def name=(name)
        @name = name
    end

    def name
        @name
    end

    # xx=は単にメソッドなので、
    # @testインスタンス変数がなくても定義はできる
    def test=(text)
        puts text
    end

    ### アクセサメソッドは簡単に書ける ###

    # attr_accessor :name とすればメソッドを用意しなくても
    # インスタンス変数の中身を読んだり、変更したりできるので
    # name=(name)とnameメソッドは不要

    #attr_accessor :name
    #attr_reader: :name
    #attr_writer: :name

end

user = User.new("sawada")


#nameメソッド / 単にインスタンス変数@nameを返すだけ
puts user.name

# name=()メソッド
# インスタンスメソッドだからuserから呼び出せるのは当然
user.name=("kato")
puts user.name

# ()は省略できるけど、普通はこんな書き方はしない
user.name="suzuki"
puts user.name

# xx=タイプの名前のメソッドを定義すると、同時に「=」演算子を定義することになるので
# 下のような定番の書き方で、値をインスタンス変数に代入することができる
user.name = "saito"
puts user.name

# まず書かないと思うけど
# こんな代入っぽい書き方でも普通のメソッドのように振る舞う…
user.test = "テストだよ"






puts "\n\n############## 例外処理 ##############\n\n"

# 外部のAPIがダウンしてたりとか予想できないことも起こりうるので
# そんな時にアプリの処理を止めないよう例外処理がかける
# ---------------------------------------------- #

def find_from_api(name)

    users = ["sawada", "sakata", "suzuki", "saito"]

    if users.find { |u| u == name }
        puts "We found #{name} in users!\n"
    else
        raise StandardError.new("Hey! We got an error.\n")
    end
end


puts "--- 基本 ---\n\n"

begin
    find_from_api("batman")
rescue => e
    puts "Not found. #{e.message}" #エラーオブジェクトを受け取って表示
ensure
    find_from_api("sawada") #例外が発生しても行う処理
end


puts "\n--- 数回トライ ---\n\n"

error_count = 0
begin
    finding_from_api("sawada") #存在しないメソッド
rescue => e
    error_count += 1
    if error_count < 4
        puts "#{error_count}回目のエラーだよ…"
        puts "#{e.message}"
        retry
    end
ensure
    puts "あきらめた!"
end

上のコードを実行するとこうなるはずです。

############## Option Hash ##############


--- GOOD ---

ID   : 14
NAME : my name here
MAIL : email@email.com
AGE  : 99
GEN  : male

--- BAD ---

ID   : 14
NAME : my name here
MAIL : email@email.com
AGE  : 99
GEN  : male

--- options省略 ---

ID   : 14
NAME : 
MAIL : 
AGE  : 
GEN  : 


############## 特殊な記号 ##############

--- Splat Arguments ---

STATUS : fine
NAME   : sawada, sakata, suzuki, saito

--- 'xx=' method  ---

sawada
kato
suzuki
saito
テストだよ


############## 例外処理 ##############

--- 基本 ---

Not found. Hey! We got an error.
We found sawada in users!

--- 数回トライ ---

1回目のエラーだよ…
undefined method `finding_from_api' for main:Object
2回目のエラーだよ…
undefined method `finding_from_api' for main:Object
3回目のエラーだよ…
undefined method `finding_from_api' for main:Object
あきらめた!

Rubyで使われる特殊な記号(!とか?とか)は下記サイトがとても参考になります。

Rubyで使われる記号の意味
Ruby QuickRef

レイアウトが崩れていたので修正しました。

http://workabroad.jp/posts/2059

wamazing
訪日外国人観光客向けインバウンドプラットフォームサービス WAmazing を運営するスタートアップ
https://info.wamazing.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした