Ruby 2/2.1, named argument e super (o splat)

ciao gente,

Qualcuno ha idea di un modo per passare argomenti ricevuti per nome
come posizionali senza sapere quali siano? Spiego meglio:

class C
def m(a, b, c)
p({a: a, b: b, c: c})
end
end

class C1 < C
def m(a:, b:, c:)
super(a, b, c) # funziona
end
end

class C2 < C
def m(a:, b:, c:)
super # eccezione
end
end

Il problema di scrivere super(e, ripetere, gli, argomenti) , oltre che
la
duplicazione, l’impossibilit di fare un metodino generico, a meno di
fare
porcate tipo

def m(a:, b:, c:)
super(*(local_variables.map {|k| binding.local_variable_get(k)}))
end

che oltretutto non son sicuro al 100% sia affidabile, as in, non so se
specificato l’ordine in cui local_variables restituisce i valori.

idee?


twitter: @riffraff
blog (en, it): www.riffraff.info
work: circleme.com

Ciao,

qualcosa cos?

class A
def test(a:, b:, c:)
[a, b, c]
end
end

class B < A
def test(**kwargs)
super
end
end

require ‘rspec/autorun’

describe A do
let(:obj) { A.new }

it ‘returns keyword arguments values as an array’ do
expect(obj.test(a: 0, b: 1, c:2)).to eq([0, 1, 2])
end
end

describe B do
let(:obj) { B.new }

it ‘passes keyword arguments using super’ do
expect(obj.test(a: 0, b: 1, c:2)).to eq([0, 1, 2])
end
end

Ju


M.Sc. Ju Liu
Twitter: @arkh4m http://twitter.com/arkh4m
Skype: johnny_arkham
Card: http://zerp.ly/ju-liu

Societ Cooperativa weLaika
Corso Vigevano 14/B, 10154 Torino (TO), Italy
http://welaika.com - [email protected]

2014-07-25 10:47 GMT+01:00 gabriele renzi [email protected]:

beh in realt il contrario :slight_smile:

Io ho un metodo nella superclasse che troppo error prone perch ha
troppi
parametri e non sono keyword argument,
quindi nella sottoclasse voglio forzare i nomi.
Nel tuo caso invece il metodo nella sottoclasse pi lasco
dell’originale,
e prende in input qualsiasi cosa.

2014-07-25 11:59 GMT+02:00 Ju Liu [email protected]:

end
Card: http://zerp.ly/ju-liu

Qualcuno ha idea di un modo per passare argomenti ricevuti per nome
def m(a:, b:, c:)
Il problema di scrivere super(e, ripetere, gli, argomenti) , oltre che
specificato l’ordine in cui local_variables restituisce i valori.
http://lists.ruby-it.org/mailman/listinfo/ml


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


twitter: @riffraff
blog (en, it): www.riffraff.info
work: circleme.com

Ciao Gabriele,
Invece di local_variables puoi utilizzare:

def m(a:, b:, c:)
puts method(method).parameters
end

=> [[:keyreq, :a], [:keyreq, :b], [:keyreq, :c]]

Ad occhio, l’ordine dovrebbe essere garantito. Guarda l’implementazione
C:

Ritorna sempre un Array Ruby, che mantiene l’ordine. Nel caso di named
params, fa l’iterazione di arg_keyword_table (che un Array C).

A patto che usi MRI :wink:

Luca

2014-07-25 16:38 GMT+02:00 Ju Liu [email protected]:

Dai, passaci un test che non passa :slight_smile:

Ju


M.Sc. Ju Liu
Twitter: @arkh4m http://twitter.com/arkh4m
Skype: johnny_arkham
Card: http://zerp.ly/ju-liu

Societ Cooperativa weLaika
Corso Vigevano 14/B, 10154 Torino (TO), Italy
http://welaika.com - [email protected]

2014-07-25 15:08 GMT+01:00 gabriele renzi [email protected]:

Luca: figo non conoscevo .parameters :open_mouth:

Ju: sure, ma in test/unit che a me rspec non piace :slight_smile:

class Base
def m(a, b, c)
{a: a, b: b, c: c}
end
end

class DumbSub < Base
def m(a:, b:, c:)
super(a, b, c)
end
end

class CoolSub < Base
def m(a:, b:, c:)
# here goes magic
end
end

if FILE == $0
require ‘test/unit’

module Tests

def test_requires_all_args
  assert_raises(ArgumentError) do
    obj.m
  end
  assert_raises(ArgumentError) do
    obj.m a: 1, b: 2
  end
  assert_raises(ArgumentError) do
    obj.m 1, 2, 3
  end
end

def test_args_are_used_correctly
  assert_equal({a: 1, b: 2, c: 3}, obj.m(c: 3, a: 1, b: 2))
end

def test_no_extra_args
  assert_raises(ArgumentError) do
    assert_equal({a: 1, b: 2, c: 3}, obj.m(a: 1, b: 2, c: 3, d: 

nil))
end
end
end
class DumbTest < Test::Unit::TestCase
include Tests
def obj
DumbSub.new
end
end
class CoolTest < Test::Unit::TestCase
include Tests
def obj
CoolSub.new
end
end
end

2014-07-27 13:34 GMT+02:00 Luca G. [email protected]:

Class: Method (Ruby 2.1.2)

Societ Cooperativa weLaika

parametri e non sono keyword argument,
2014-07-25 11:59 GMT+02:00 Ju Liu [email protected]:

end
let(:obj) { A.new }
expect(obj.test(a: 0, b: 1, c:2)).to eq([0, 1, 2])
Skype: johnny_arkham

class C1 < C

binding.local_variable_get(k)}))

twitter: @riffraff
http://lists.ruby-it.org/mailman/listinfo/ml
[email protected]

lucaguidi.com


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


twitter: @riffraff
blog (en, it): www.riffraff.info
work: circleme.com