Memoize

BasicWerk   EC Support   Technique   Facebook  

20140817160907_ruby_def_method_args

ruby_def_method_args

 

def が受け取る引数では相互参照、デフォルトの設定ができる。

 
def foo (n, m, s=n*m)
    puts "#{n} x #{m} = #{s}"
end
 
# デフォルトを設定した引数は省略できる
foo(100, 200)
# => 100 x 200 = 20000
 

 

可変長の引数を受け取るときは変数の前にスターを付ける。

メソッド内で可変長変数を使うときはスターを取る。

 
def bar (f, *r)
    print "First arg is #{f}, "
    puts "Rest is #{r.inspect}"
end
 
bar("first", "second")
# => First arg is first, Rest is ["second"]
# 可変長引数は1つの時でもメソッドに渡された時点で配列に格納される。
 
bar("first", "second", "third")
# => First arg is first, Rest is ["second", "third"]
 

 

メソッドにブロックを渡した場合、メソッド内からは yield でブロックを参照する。

 
def hello (name)
    yield("Hello, #{name}!")
end
 
# Hello, name! に対して色んな処理ができる
 
hello("John") {|str| puts str}
# => Hello, John!
 
hello("Paul") {|str| str}
# => "Hello, Paul!"
 
hello("Eric") {|str| str.scan(/\w+/)}
# => ["Hello", "Eric"]
 

 

initialize の最後の引数に & が付いている時、ブロックを渡すと Proc に変換され、new されたオブジェクトが保持する。

block_method.rb
 
#! /usr/bin/ruby
# coding: utf-8
 
class String_editor
    def initialize (&p)
        @p = p
    end
    def get_result (str)
        @p.call(str)
    end
end
 
cut_words = String_editor.new {|str| str.scan(/\w+/)}
p cut_words.get_result("Today is the day.")
 
# => ["Today", "is", "the", "day"]
 

 

上記のオブジェクトは initialize の時点で文字列をどう料理するかレシピを受け取って proc オブジェクトに保持する。

get_result メソッドの引数で渡された文字列をレシピ通りに料理して返す。

 

レシピが同じで、文字列(具材)が異なる処理が複数あるときに便利。

 


© Shin Nakamura/BasicWerk 2014