JSでよく使うあの機能・文法をRubyで使うにはどうしたらええんや、と思ったのでそれっぽい似たものをまとめた。
setTimeout
で非同期処理っぽいやつ
JSの場合
setTimeout(() => {
// do something
}, 0);
Thread
を使えばよさそう
Thread.new {
# do something
}
Promise
promiseというgemを使うと簡単に書ける。
x = promise { 1 + 2 }
puts x # 3
ちなみにconcurrent-rubyというのもあり、こちらのほうが新しく、頻繁にメンテされている。
単なる遅延評価ではなくスレッドセーフなのが売りらしい。
require 'concurrent'
result = Concurrent::Promise.execute do
1 + 2
end
p result.value # 3
ちなみにこっちだと、JSっぽいthen
を使った実装もできる
require 'concurrent'
chained_result = Concurrent::Promise
.new { 10 }
.then { |result| result + 10 }
.then { |result| result + 5 }
.execute
puts chained_result.value # 25
Promise.all
concurrent-rubyのzip
メソッドを使う。
require 'concurrent'
p1 = Concurrent::Promise.new { 10 }
p2 = Concurrent::Promise.new { 20 }
p3 = Concurrent::Promise.new { 30 }
results = Concurrent::Promise
.zip(p1, p2, p3)
.then { |v| v }
p results.value # [10, 20, 30]
変数に関数を代入
JSでよくやるこれ。
JSの場合
const func = function() {
return 1 + 2;
}
console.log(func()); // 3
Proc
を使うとそれっぽくできる
x = Proc.new do
1 + 2
end
puts x.call # 3
これもよい!
x = ->{ 1 + 2 }
puts x.call # 3
即時関数
上で出てきたProc
をすぐに呼び出すパターン
result ||= ->{
1 + 2
}.call
p result // 3
begin...end
を使うパターン。この記事によるとこちらのほうが速いらしい。
result ||= begin
1 + 2
end
p result # 3