Trans
November 3, 2007, 1:27am
1
Lets say I have a method using the not-so-uncommon keyword options
pattern:
def foo(*args)
opts = (Hash === args.last ? args.pop : {})
…
Now I want to define another method, which is essentially a special
alias, that places a particular option as the first argument:
def bar(opt, *args)
foo(*args, :baz => opt) # doesn’t work.
end
Is there no better way to do this than:
def bar(opt, *args)
opts = (Hash === args.last ? args.pop : {})
opts[:baz] = opt
args << opts
foo(*args)
end
Boy, it really makes you wish we had keyword arguments built-in to the
language!!! I forget, will we have those in 1.9? If so how the above
look then?
T.
Trans
November 3, 2007, 9:49am
2
On Nov 3, 2007 1:27 AM, Trans [email protected] wrote:
Lets say I have a method using the not-so-uncommon keyword options
pattern:
def foo(*args)
opts = (Hash === args.last ? args.pop : {})
Hi Tom
irb(main):001:0> def foo *args
irb(main):002:1> opts, args = args.partition{|x| Hash === x }
irb(main):003:1> opts = opts.inject{ |s,x| s.update x }
seems this should do the trick
...
Now I want to define another method, which is essentially a special
alias, that places a particular option as the first argument:
def bar(opt, *args)
foo(*args, :baz => opt) # doesn’t work.
now it does , almost
foo( :baz => opt, *args)
HTH
Robert
Boy, it really makes you wish we had keyword arguments built-in to the
language!!! I forget, will we have those in 1.9? If so how the above
look then?
Yes indeed I wished for them for a long time
R.
Trans
November 4, 2007, 12:09am
3
On Nov 3, 4:47 am, “Robert D.” [email protected] wrote:
irb(main):001:0> def foo *args
def bar(opt, *args)
foo(*args, :baz => opt) # doesn’t work.
now it does , almost
foo( :baz => opt, *args)
Interesting approach. Thanks.
T.
Trans
November 4, 2007, 1:51am
4
On Nov 2, 8:27 pm, [email protected] wrote:
def bar(opt, *args)
end
Boy, it really makes you wish we had keyword arguments built-in to the
language!!! I forget, will we have those in 1.9? If so how the above
look then?
How flexible do you need to be with the argument handling? Would
something like the following work?
def foo a, b=‘default’, opts={}
puts “a is #{a}, b is #{b}”
opts.each {|k,v| puts “#{k} => #{v}”}
puts ‘-’*10
end
def bar opt, a, b=‘default2’, opts={}
foo a, b, opts.merge!({:baz => opt})
end
foo 1
foo 2, ‘foo’
foo 3, ‘foo’, :opt1 => ‘one’, :opt2 => ‘two’
bar ‘extra’, 4
bar ‘extra’, 5, ‘bar’, :opt1 => ‘one’, :opt2 => ‘two’
Brian A.
Trans
November 4, 2007, 1:11am
5
Robert D. wrote:
On Nov 3, 2007 1:27 AM, Trans [email protected] wrote:
Lets say I have a method using the not-so-uncommon keyword options
pattern:
def foo(*args)
opts = (Hash === args.last ? args.pop : {})
Hi Tom
irb(main):001:0> def foo *args
irb(main):002:1> opts, args = args.partition{|x| Hash === x }
irb(main):003:1> opts = opts.inject{ |s,x| s.update x }
seems this should do the trick
...
Why not simply:
def foo(*args)
opts = args[0]
args = args[1…-1]
p opts, args
end
def bar(opt, *args)
foo(:baz =>opt, *args)
puts
foo(:baz =>opt, :other => ‘pie’, *args)
end
bar(10, 20, 30)
–output:–
{:baz=>10}
[20, 30]
{:baz=>10, :other=>“pie”}
[20, 30]
Trans
November 4, 2007, 1:53am
6
On Nov 4, 2007 1:12 AM, 7stud – [email protected] wrote:
irb(main):001:0> def foo *args
args = args[1…-1]
bar(10, 20, 30)
–output:–
{:baz=>10}
[20, 30]
{:baz=>10, :other=>“pie”}
[20, 30]
because it does not work, try
bar( 1, 2, 3, :a=> 42)
And putting kw params before positionals is too unusual to be likely
to be used a lot
my solution is ugly because you have to exactly that but it is at
least hidden from the users of foo and bar.
R.
Trans
November 4, 2007, 3:10am
7
On Nov 3, 8:50 pm, Brian A. [email protected] wrote:
foo a, b, opts.merge!({:baz => opt})
end
Problem is I need *args (an untold amount).
T.