concurrent-ruby
concurrent-ruby copied to clipboard
Add keyword arguments to async
Feature request
Add support for keyword arguments when using async
From the docs
class Echo
include [Concurrent](https://ruby-concurrency.github.io/concurrent-ruby/1.2.3/Concurrent.html)::Async
def echo(msg)
print "#{msg}\n"
end
end
horn = Echo.new
horn.echo('zero') # synchronous, not thread-safe
# returns the actual return value of the method
horn.async.echo('one') # asynchronous, non-blocking, thread-safe
# returns an IVar in the :pending state
horn.await.echo('two') # synchronous, blocking, thread-safe
but if i modify it to use named arguments like so it doesn't work
class Echo
include [Concurrent](https://ruby-concurrency.github.io/concurrent-ruby/1.2.3/Concurrent.html)::Async
def echo(msg: )
print "#{msg}\n"
end
end
horn = Echo.new
horn.echo(msg: zero') # synchronous, not thread-safe
# returns the actual return value of the method
horn.async.echo(msg: 'one') # asynchronous, non-blocking, thread-safe
# returns an IVar in the :pending state
horn.await.echo(msg: 'two') # synchronous, blocking, thread-safe
#when I try to get the value
horn.await.echo(msg: 'two').value #nil
horn.await.echo(msg: 'two').reason #<ArgumentError: wrong number of arguments (given 1, expected 0)>
I appreciate any future feedback from the maintainers on this 🙏
System information
* Operating system: mac
* Ruby implementation: Ruby
* `concurrent-ruby` version: 1,2,3
* `concurrent-ruby-ext` installed: no
* `concurrent-ruby-edge` used: no
There is nothing wrong to get nil
from value
. Because print
just write to STDOUT and return nil
And I can not reproduce ArgumentError
from reason
. Would you try that again ?
I have same error in Ruby 3.0.3, concurrent-ruby 1.3.4.
class Echo1
include Singleton
include Concurrent::Async
def echo(msg)
puts msg
end
end
def _a(echoer)
p echoer.class
echoer.async.echo('A')
end
and _a Echo1.instance
output is:
Echo1
#<Concurrent::IVar:0x000056139ac49d58
@__Condition__=#<Thread::ConditionVariable:0x000056139ac383a0>,
@__Lock__=#<Thread::Mutex:0x000056139ac3a2e0>,
@copy_on_deref=nil,
@do_nothing_on_deref=true,
@dup_on_deref=nil,
@event=#<Concurrent::Event:0x000056139ac10e18 @__Condition__=#<Thread::ConditionVariable:0x000056139ac27af0>, @__Lock__=#<Thread::Mutex:0x000056139ac10198>, @iteration=0, @set=true>,
@freeze_on_deref=nil,
@observers=#<Concurrent::Collection::CopyOnWriteObserverSet:0x000056139ac26650 @__Condition__=#<Thread::ConditionVariable:0x000056139ac24ee0>, @__Lock__=#<Thread::Mutex:0x000056139ac251b0>, @observers={}>,
@reason=nil,
@state=:fulfilled,
@value=nil>
(works fine)
class Echo2
include Singleton
include Concurrent::Async
def echo(msg:)
puts msg
end
end
def _b0(echoer)
p echoer.class
echoer.echo(msg: 'B0')
end
def _b1(echoer)
p echoer.class
echoer.async.echo(msg: 'B1')
end
_b0 Echo2.instance
output is:
Echo2
B0
(works fine)
and _b1 Echo2.instance
output is:
Echo2
=> #<Concurrent::IVar:0x00005613a431bad8
@__Condition__=#<Thread::ConditionVariable:0x00005613a431b628>,
@__Lock__=#<Thread::Mutex:0x00005613a431b650>,
@copy_on_deref=nil,
@do_nothing_on_deref=true,
@dup_on_deref=nil,
@event=#<Concurrent::Event:0x00005613a431b1f0 @__Condition__=#<Thread::ConditionVariable:0x00005613a431b128>, @__Lock__=#<Thread::Mutex:0x00005613a431b1a0>, @iteration=0, @set=true>,
@freeze_on_deref=nil,
@observers=#<Concurrent::Collection::CopyOnWriteObserverSet:0x00005613a431afe8 @__Condition__=#<Thread::ConditionVariable:0x00005613a431aef8>, @__Lock__=#<Thread::Mutex:0x00005613a431af20>, @observers={}>,
@reason=#<ArgumentError: wrong number of arguments (given 1, expected 0; required keyword: msg)>,
@state=:rejected,
@value=nil>
where @reason
has error.
Could you start a PR to fix and add specs for this?
It's probably just using *args
somewhere without ruby2_keywords
.
@eregon I should have some time near the end of the weak if no else picks this up
ok, I hope it's not a big deal.