# 8-2 Proc#new以外のProcオブジェクトの作り方
lambda_obj = lambda { 1 }
#<Proc:0x0000561034409e18@(pry):3 (lambda)>
lambda_obj.class
Proc
lambda_obj.call
1
# 8-2-2 Kernel.#lambdaメソッド
inc = ->(x) { x + 1 }
#<Proc:0x0000561034b90a38@(pry):7 (lambda)>
inc.(1)
2
lo = lambda {|x| x + 1}
#<Proc:0x0000561034c0ae50@(pry):9 (lambda)>
lo.call(10)
11
# 8-3 Proc.new/Kernel.proc/Kernel.lambda
def proc_return
Proc.new {return 1; puts :unreachable}.call
:unreachable
end
:proc_return
proc_return
1
Proc.new {return 1; puts :unreachable}.call
LocalJumpError: unexpected return (pry):19:in `block in <main>' (pry):19:in `<main>' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `load' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `<main>'
lambda { return 1; puts :unreachable}.call
1
def lambda_return
lambda {return 1; puts :unreachable}.call
:reachable
end
lambda_return
:reachable
Proc.new {break 1; puts :unreachable}.call
LocalJumpError: break from proc-closure (pry):27:in `block in <main>' (pry):27:in `<main>' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `load' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `<main>'
def proc_break
Proc.new { break 1 ; puts :unreachable}.call
end
proc_break
LocalJumpError: break from proc-closure (pry):29:in `block in proc_break' (pry):29:in `proc_break' (pry):32:in `<main>' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `load' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `<main>'
lambda { break 1; puts :unreachable }.call
1
def lambda_break
lambda {break 1; puts :unreachable}.call
:reachable
end
lambda_break
:reachable
def wrap_method(proc_or_lambda)
x = proc_or_lambda.call(1)
x.to_s
end
wrap_method proc {|x| next x; x.succ}
"1"
wrap_method lambda {|x| next x; x.succ }
"1"
# 8-3-2 引数の違い
Proc.new {|x, y| x}.call(1)
1
lambda {|x, y| x}.call(1)
ArgumentError: wrong number of arguments (given 1, expected 2) (pry):50:in `block in <main>' (pry):50:in `<main>' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `load' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `<main>'
# 8-3-3 Proc#lambda?
args_proc = Proc.new {|x, y| [x, y]}
puts args_proc[1,2,3]
puts args_proc[1]
puts args_proc[[1,2]]
[1, 2] [1, nil] [1, 2]
args_lambda = lambda {|x, y| [x, y]}
puts args_lambda[1,2,3]
ArgumentError: wrong number of arguments (given 3, expected 2) (pry):58:in `block in <main>' (pry):59:in `<main>' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `load' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `<main>'
puts args_lambda[1]
ArgumentError: wrong number of arguments (given 1, expected 2) (pry):58:in `block in <main>' (pry):62:in `<main>' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `load' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `<main>'
puts args_lambda[[1,2]]
ArgumentError: wrong number of arguments (given 1, expected 2) (pry):58:in `block in <main>' (pry):63:in `<main>' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `load' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `<main>'
proc {}.lambda?
false
lambda {}.lambda?
true
1.method(:+).to_proc.lambda?
true
1.method(:+).to_proc.call()
ArgumentError: wrong number of arguments (given 0, expected 1) (pry):68:in `+' (pry):68:in `<main>' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `load' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `<main>'
1.method(:+).to_proc.call(2, 3)
ArgumentError: wrong number of arguments (given 2, expected 1) (pry):69:in `+' (pry):69:in `<main>' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch' /home/jovyan/.gem/ruby/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run' /home/jovyan/.gem/ruby/2.6.0/gems/iruby-0.3/bin/iruby:5:in `<top (required)>' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `load' /home/jovyan/.gem/ruby/2.6.0/bin/iruby:23:in `<main>'
# 8-4 Rubyでのクロージャ
# 8-4-1 クロージャとしてのProcオブジェクトの動作
def create_proc
str = 'from create_proc'
Proc.new {str}
end
:create_proc
proc_obj = create_proc
#<Proc:0x00005610346fa870@(pry):74>
str= 'from toplevel'
proc_obj.call
"from create_proc"
str = 'from toplevel'
top_level_proc = Proc.new {str}
top_level_proc.call
"from toplevel"
str += 'append strings'
top_level_proc.call
"from toplevelappend strings"
# 9章 Methodクラス
# 9-1 Methodオブジェクト
doubule = Proc.new {|x| x * 2}
doubule.(1)
2
array = [1,2,3,4,5]
array_shift = array.method(:shift)
#<Method: Array#shift>
array_shift.call
1
array
[2, 3, 4, 5]
class Dog
def bark
puts 'wan!!'
end
end
dog = Dog.new
bark_wan = dog.method(:bark)
#<Method: Dog#bark>
class Dog
def bark
puts 'bowwow!!'
end
end
:bark
dog.bark
bowwow!!
bark_wan.call
wan!!
def dog.bark
puts 'kyankyan!!'
end
:bark
dog.bark
kyankyan!!
bark_wan.call
wan!!
# 9-1-2 メソッドに関する引数の情報
class Rec
def rec(i)
p i
return if i.nil?
self.rec(nil)
end
end
Rec.new.rec(3)
3 nil
rec = Rec.new
#<Rec:0x00005610346a3408>
rec_method = rec.method(:rec)
#<Method: Rec#rec>
rec_method.call(3)
3 nil
class Rec
def rec(i)
p "override! #{i}"
return if i.nil?
rec(nil)
end
end
:rec
rec_method.call(3) #再帰の場合はメソッドが書き換わってしまう!
3 "override! "
# 9-1-2 メソッドに関する引数の情報
class Arity
def arity_0; end
def arity_1(x); end
def arity_2(x, y); end
def arity_variable_length(*x); end
def arity_variable_length_with_default_arg(x, *y); end
def arity_default_val_1(x = 1); end
def arity_default_val_2(x, y = 1); end
def arity_keyword_2(x:, y:); end
end
:arity_keyword_2
arity_obj = Arity.new
puts arity_obj.method(:arity_0).arity
puts arity_obj.method(:arity_1).arity
puts arity_obj.method(:arity_2).arity
puts arity_obj.method(:arity_variable_length).arity
puts arity_obj.method(:arity_variable_length_with_default_arg).arity
puts arity_obj.method(:arity_default_val_1).arity
puts arity_obj.method(:arity_default_val_2).arity
puts arity_obj.method(:arity_keyword_2).arity
0 1 2 -1 -2 -1 -2 1
class MethodParameter
def arity0; end
def arity1(x); end
def arity1_and_default_val(x = 1); end
def arity1_and_valiable_arg(x, *y); end
def arity1_and_block_arg(x, &y); end
end
:arity1_and_block_arg
method_params = MethodParameter.new
puts method_params.method(:arity0).parameters
puts method_params.method(:arity1).parameters
puts method_params.method(:arity1_and_default_val).parameters
puts method_params.method(:arity1_and_valiable_arg).parameters
puts method_params.method(:arity1_and_block_arg).parameters
[] [[:req, :x]] [[:opt, :x]] [[:req, :x], [:rest, :y]] [[:req, :x], [:block, :y]]
puts_method = Kernel.method(:puts)
puts_method.parameters
[[:rest]]
class KeywordArgs
def normal_method_allow_keyword_args(first_arg, second_arg, third_arg)
[first_arg, second_arg, third_arg]
end
private
def method_missing(name, *args)
method_name = name.to_s + '_allow_keyword_args'
super unless respond_to? method_name
args_hash = args.first
new_args = self.method(method_name).parameters.map do |(req, arg_name)|
args_hash[arg_name]
end
__send__ method_name, *new_args
end
end
:method_missing
KeywordArgs.new.normal_method(third_arg: 1, first_arg: 2, second_arg: 3)
[2, 3, 1]
# 9-1-3 メソッドの持ち主/名前/レシーバ
class MethodInfo
def sample_method; end
end
obj = MethodInfo.new
sample_method = obj.method(:sample_method)
sample_method.owner
MethodInfo
sample_method.name
:sample_method
sample_method.receiver
#<MethodInfo:0x0000561034d19c38>
sample_method.receiver == obj
true
# 9-1-4 メソッドがオーバーライドしたメソッド
class OriginalClass
def hello
'hello'
end
end
class OverrideClass < OriginalClass
def hello
'hello hello'
end
end
:hello
hello_method = OverrideClass.new.method(:hello)
puts hello_method
puts hello_method.owner
puts hello_method.call
puts hello_method.super_method
puts hello_method.super_method.owner
puts hello_method.super_method.call
#<Method: OverrideClass#hello> OverrideClass hello hello #<Method: OriginalClass#hello> OriginalClass hello
p OriginalClass.new.method(:hello).super_method
nil