読者です 読者をやめる 読者になる 読者になる

Studio3104::BLOG.new

uninitialized constant Studio3104 (NameError)

[Ruby] method の Thread をたてるときに method に引数を渡す

普通にメソッドをスレッド化するとこうなる

#!/usr/bin/env ruby
require 'thread'

def foo
  num = 0
  loop do
    sleep 1
    num += 1
    p num
  end
end

t = Thread.new(&method(:foo))
t.join

引数を取るメソッドをスレッド化したい場合

これは Syntax error

#!/usr/bin/env ruby
require 'thread'

def foo(num)
  loop do
    sleep 1
    num += 1
    p num
  end
end

t = Thread.new(&method(:foo), 0)
t.join
-:12: syntax error, unexpected ',', expecting ')'
t = Thread.new(&method(:foo), 0)
                             ^

shell returned 1

これは ArgumentError

#!/usr/bin/env ruby
require 'thread'

def foo(num)
  loop do
    sleep 1
    num += 1
    p num
  end
end

t = Thread.new(&method(:foo, 0))
t.join
-:12:in `method': wrong number of arguments (2 for 1) (ArgumentError)
  from -:12:in `<main>'

shell returned 1

これが正解

#!/usr/bin/env ruby
require 'thread'

def foo(num)
  loop do
    sleep 1
    num += 1
    p num
  end
end

t = Thread.new(0, &method(:foo))
t.join
とのことです

f:id:studio3104:20140911014653p:plain