Kan dit makkelijker?

Geplaatst door Michiel de Mare do, 07 sep 2006 05:07:00 GMT

Er zijn een paar dingen die ik regelmatig tegenkom in Ruby, en waarvan ik denk dat het makkelijker kan. Dit bijvoorbeeld:
x = foo(y)
return x if x
Wat ik liever zou zeggen is:
only_return_if foo(y)
Een andere is dit:
x = {}
arr.each {|o| x[o] = foo(o) }
Hier zou ik liever zeggen:
arr.make_hash {|o| [o, foo(o)] }
Of de tegenhanger:
x = {}
arr.each {|o| x[o.foo] = o }
Dat schrijf ik liever als:
arr.key_hash &:foo

Voor het bovenste probleem heb ik geen oplossing – de andere kan ik zelf wel aan array toevoegen, maar ik gebruik veel liever een oplossing zonder ‘monkey patching’.

8 september: Update

Het kan! Niet met mijn syntax, maar wel iets vergelijkbaars:
def iff(a)
  yield a if a
end

def foo(a)
  iff(a) {|x|return x}
  'het mocht niet zo zijn'
end

foo('ja!') => 'ja'
foo(nil)     => 'het mocht niet zo zijn'

Geplaatst in  | 5 reacties

Reacties

  1. Erik Terpstra zei ongeveer 22 uur later:

    x = foo(y); return x if x

    doet hetzelfde als:

    foo(y)

    Ruby retourneert altijd de waarde van de laatste evaluatie.

    Voor de 2e situatie kun je dit doen:

    arr.to_h{|o| [o, foo(o)]}

    Je hebt dan wel Ruby Facets nodig, zie:

    http://facets.rubyforge.org/api/core/index.html

    De 3e situatie:

    arr.partition_by{|o| o.foo}

    (Heeft ook Ruby Facets nodig)

  2. Michiel zei ongeveer 22 uur later:

    Wat betreft het eerste probleem: foo(y) is niet de laatste expressie in een methode. Ik wil snel retourneren als foo(y) een resultaat oplevert, anders wil ik mijn resultaat op een andere manier berekenen.

    bv:

    def lookup(id)
      only_return_if cache[id]
      # generate value
      # store value in cache
      # return value
    end
    

    Ruby Facets ziet er interessant uit, maar is toch een library die monkey patching uitvoert op je core classes, en dat probeer ik zoveel mogelijk te vermijden.

  3. Erik Terpstra zei ongeveer 23 uur later:

    Wat betreft het eerste probleem: foo(y) is niet de laatste expressie

    Ok, dat had ik verkeerd begrepen. Ik zou het zo geschreven hebben:

    def foo x = foo(y) and return x # do other stuff… end

    Maar dat zal niet iedereen leesbaar vinden.

    Ruby Facets ziet er interessant uit, maar is toch een library die monkey patching uitvoert op je core classes, en dat probeer ik zoveel mogelijk te vermijden.

    Zijn er situaties waarin je ‘monkey patching’ wel acceptabel vindt?

  4. Erik Terpstra zei ongeveer 23 uur later:

    Wat betreft het eerste probleem: foo(y) is niet de laatste expressie

    Ok, dat had ik verkeerd begrepen. Ik zou het zo geschreven hebben:

    def foo
      x = foo(y) and return x
      # do other stuff...
    end

    Maar dat zal niet iedereen leesbaar vinden.

    Ruby Facets ziet er interessant uit, maar is toch een library die monkey patching uitvoert op je core classes, en dat probeer ik zoveel mogelijk te vermijden.

    Zijn er situaties waarin je ‘monkey patching’ wel acceptabel vindt?

  5. Michiel zei ongeveer 23 uur later:

    x = foo(y) and return x

    Kijk, daar was ik naar op zoek! Bedankt!

    Wat betreft monkey patching – in een framework als rails vind ik het ok, maar als je met meerdere developers werkt dan ben ik bang dat iedereen zijn eigen methodes gaat toevoegen aan core classes, en dat het een enorme brei spaghetti wordt.

(Laat url/e-mail achter »)

   Voorvertoning