首页 > 技术文章 > ruby中的多线程和函数的关键字传参

bainianminguo 2019-08-01 17:10 原文

1、实现ruby中的多线程

# def test1
#   n = 1
#   if n > 10
#     puts "test1结束"
#   else
#     while true
#       sleep 2
#       puts n
#       n = n + 1
#     end
#   end
# end
#
#
# def test2
#   n = 100
#   if n > 100
#     puts "test2结束"
#   else
#     while true
#       sleep 2
#       puts n
#       n = n + 10
#     end
#   end
# end
#
# t1 = Thread.new{test1()}
# t2 = Thread.new{test2()}
#
# t1.join
# t2.join
#

 

ruby的多线程中也是利用queue进行数据的交互和传递,看下下面的例子

$queue = Queue.new

def test1
  sleep 2
  puts "test1"
  $queue << "test111"
end

def test2

  sleep 4
  puts "test2"
  $queue << "test22222222"
end


t1 = Thread.new{test1}
t2 = Thread.new{test2}

t1.join
t2.join

2.times do
  res = $queue.pop
  puts res
end

 

通过queue对象就可以子线程和主进程之间进行数据交互

 

定义一个局部变量的queue对象,做数据传递

def test1(queue)
  sleep 2
  puts "test1"
  queue << "test111111111111111111"
end

def test2(queue)

  sleep 4
  puts "test2"
  queue << "test222222222222222"
end

def test
  queue = Queue.new
  t1 = Thread.new{test1(queue)}
  t2 = Thread.new{test2(queue)}

  t1.join
  t2.join
  2.times do
    res = queue.pop
    puts res
  end
end


test

 

 

 

2、实现ruby中的关键字传参,这里要用冒号,而不是等号

def test(a:"a1",b:"b1",c:"c1")
  puts a
  puts b
  puts c
end

test(a:"a2",c:"c2")

 

3、ruby中普通参数和关键字参数混合使用

def test1(d,a:"a1",b:"b1",c:"c1")
  # 这里的普通参数必须要放在前面,放在后面会报错的
  puts a
  puts b
  puts c
  puts d
end

test1(1)

test1(1,c:"c2")

 

4、ruby函数关键字和普通参数混用,传递一个Hash,函数的参数使用传递的值和hash中的值

args = {"a":"a11","b":"b11","c":"c11"}

def test2(d,a:"a1",b:"b1",c:"c1")
  # 这里的普通参数必须要放在前面,放在后面会报错的
  puts "test22222222222222"
  puts a
  puts b
  puts c
  puts d
end

 

5、ruby函数关键字参数和普通参数混用,函数使用默认值和hash两种

args = {"a":"a11","c":"c11"}

def test3(d,a:"a1",b:"b1",c:"c1")
  # 这里的普通参数必须要放在前面,放在后面会报错的
  puts "test333333333333"
  puts a
  puts b
  puts c
  puts d
end


test3(2,args)

 

推荐阅读