Confusion Over Keyword Arguments

Discussion in 'Ruby' started by Mr. Big, Mar 1, 2006.

  1. Mr. Big

    Mr. Big Guest

    Ruby 2.0 will include new syntax for hash literals: {a:3, b:4}. However,
    one can leave off the {}s to create a hash. Current software uses this
    for "faked" keyword arguments.

    def my_meth(options={})
    end

    (1) my_meth:)keyword => 3) # Ruby 1.8
    (2) my_meth(keyword:3, another_option:10) # Ruby 2.0

    Won't this create confusion? Why must keyword arguments use the same
    syntax as new hash literals? How about "=" for keyword arguments instead
    (such as in python)?

    --
    Posted via http://www.ruby-forum.com/.
     
    Mr. Big, Mar 1, 2006
    #1
    1. Advertising

  2. On Mar 1, 2006, at 3:32 PM, Mr. Big wrote:

    > Ruby 2.0 will include new syntax for hash literals: {a:3, b:4}.
    > However,
    > one can leave off the {}s to create a hash. Current software uses this
    > for "faked" keyword arguments.
    >
    > def my_meth(options={})
    > end
    >
    > (1) my_meth:)keyword => 3) # Ruby 1.8
    > (2) my_meth(keyword:3, another_option:10) # Ruby 2.0
    >
    > Won't this create confusion? Why must keyword arguments use the same
    > syntax as new hash literals? How about "=" for keyword arguments
    > instead
    > (such as in python)?
    >
    > --
    > Posted via http://www.ruby-forum.com/.
    >



    Ruby doesn't have keyword arguments at all. When you call a method
    with "keyword arguments" you are really just passing in a single
    hash. There's no confusion because the syntaxes do the exact same thing
    example_hash = { a: 1, b: 2 }
    my_meth(example_hash) #pass a hash as the single argument to my_meth
    my_meth(a: 1, b: 2) # pass a hash as the single argument to my_meth

    Neither of these will actually set local variables, the signature for
    a method like this is as follows:

    def my_meth(argument_hash)
    ...
    end

    e.g.:

    def my_meth(arg_hash)
    arg_hash[:a] + arg_hash[:b]
    end

    So one would say my_meth:)a => 1, :b => 2) and get back 3
    or one would say my_meth(a: 1, b: 2) and get back 3
    or one would say
    example_hash = { :a => 1, :b => 2 }
    my_meth(example_hash) # returns 3 also
     
    Logan Capaldo, Mar 1, 2006
    #2
    1. Advertising

  3. Mr. Big

    Mr. Big Guest

    > When you call a method with "keyword arguments" you are really just passing in a single hash.

    Keyword arguments aren't hashes.

    def my_meth(foo:, bar:)
    foo + bar
    end
    my_meth(foo:3, bar:4)

    # later we see this, we do not know how the method is defined.
    my_meth2(arg:100, arg2:10)

    There is no way to tell if my_meth2 is using a hash or keyword arguments
    without looking it up. However, if keyword arguments used "=" instead,
    there would be no double checking.
    my_meth2(arg=100, arg2=10)

    A keyword argument that takes a symbol ends up looking very ugly (I
    guess "=" doesn't work well here, either):
    foo(key::symbol) or
    foo(key: :symbol)

    --
    Posted via http://www.ruby-forum.com/.
     
    Mr. Big, Mar 1, 2006
    #3
  4. Mr. Big

    Jeff Cohen Guest

    Mr. Big wrote:
    > Ruby 2.0 will include new syntax for hash literals: {a:3, b:4}. However,
    > one can leave off the {}s to create a hash.
    >
    > Won't this create confusion?


    I am personally not in favor of allowing the : character instead of =>.
    (The last time I checked, this new syntax was marked as highly
    experimental and not a done deal yet).

    With colons already in use to denote the start of a symbol name, using a
    colon as a separator between a key-value pair is going to confuse many
    people, especially since everyone seems to like their own whitespace
    conventions.

    I hope Matz reconsiders and decides that the "experiment" is not worth
    it.

    As an aside, I wonder why => was chosen instead of a simple = sign.
    Seems like it's un-ruby-like to make us type the extra character :)

    Jeff
    www.softiesonrails.com


    --
    Posted via http://www.ruby-forum.com/.
     
    Jeff Cohen, Mar 1, 2006
    #4
  5. Mr. Big

    Guest

    Hi --

    On Thu, 2 Mar 2006, Jeff Cohen wrote:

    > Mr. Big wrote:
    >> Ruby 2.0 will include new syntax for hash literals: {a:3, b:4}. However,
    >> one can leave off the {}s to create a hash.
    >>
    >> Won't this create confusion?

    >
    > I am personally not in favor of allowing the : character instead of =>.
    > (The last time I checked, this new syntax was marked as highly
    > experimental and not a done deal yet).
    >
    > With colons already in use to denote the start of a symbol name, using a
    > colon as a separator between a key-value pair is going to confuse many
    > people, especially since everyone seems to like their own whitespace
    > conventions.
    >
    > I hope Matz reconsiders and decides that the "experiment" is not worth
    > it.
    >
    > As an aside, I wonder why => was chosen instead of a simple = sign.
    > Seems like it's un-ruby-like to make us type the extra character :)


    I don't think it's extra. I would hate to have to parse -- visually
    -- things like:

    hash = { a = 1, b = 2, 4 = 5 }

    etc.


    David

    --
    David A. Black ()
    Ruby Power and Light (http://www.rubypowerandlight.com)

    "Ruby for Rails" chapters now available
    from Manning Early Access Program! http://www.manning.com/books/black
     
    , Mar 1, 2006
    #5
  6. Mr. Big

    Jeff Cohen Guest

    David Black wrote:
    > I don't think it's extra. I would hate to have to parse -- visually
    > -- things like:
    >
    > hash = { a = 1, b = 2, 4 = 5 }


    That's true. I guess I was thinking of method calls, like:

    start_hockey_game:)home_team = "Chicago", :away_team = "Detroit")

    In other words, in reality most of the hashes I create are implicit
    hashes created when passing method arguments.

    But you're right, for your canonical case, it would be bad; and that
    alone probably justifies having a separate syntax for the key-value
    pair.

    Jeff

    --
    Posted via http://www.ruby-forum.com/.
     
    Jeff Cohen, Mar 1, 2006
    #6
  7. Hi,

    In message "Re: Confusion Over Keyword Arguments"
    on Thu, 2 Mar 2006 05:32:50 +0900, "Mr. Big" <> writes:

    |def my_meth(options={})
    |end
    |
    |(1) my_meth:)keyword => 3) # Ruby 1.8
    |(2) my_meth(keyword:3, another_option:10) # Ruby 2.0
    |
    |Won't this create confusion?

    No, on the virtual implementation (only inside of my brain), they are
    same things. The magic is in receiving and interpreting arguments.

    |Why must keyword arguments use the same
    |syntax as new hash literals?

    No, we don't have to. The colon can be ugly with symbols, for
    example,

    db.find(order: :date)

    is not good looking. Any other proposal (except for "=')?

    |How about "=" for keyword arguments instead
    |(such as in python)?

    Unfortunately, assignments are legal in argument list in Ruby.

    matz.
     
    Yukihiro Matsumoto, Mar 1, 2006
    #7
  8. Yukihiro Matsumoto wrote:
    > Hi,
    >
    > In message "Re: Confusion Over Keyword Arguments"
    > on Thu, 2 Mar 2006 05:32:50 +0900, "Mr. Big" <> writes:
    >
    > |def my_meth(options={})
    > |end
    > |
    > |(1) my_meth:)keyword => 3) # Ruby 1.8
    > |(2) my_meth(keyword:3, another_option:10) # Ruby 2.0
    > |
    > |Won't this create confusion?
    >
    > No, on the virtual implementation (only inside of my brain), they are
    > same things. The magic is in receiving and interpreting arguments.
    >
    > |Why must keyword arguments use the same
    > |syntax as new hash literals?
    >
    > No, we don't have to. The colon can be ugly with symbols, for
    > example,
    >
    > db.find(order: :date)
    >
    > is not good looking. Any other proposal (except for "=')?


    We are running out of characters, could we instead switch to
    be the very first fully Unicode language? Have the actual
    lambda sign for lambdas, the sigil for symbols and so on.. :)

    > |How about "=" for keyword arguments instead
    > |(such as in python)?
    >
    > Unfortunately, assignments are legal in argument list in Ruby.
    >
    > matz.



    E

    --
    Posted via http://www.ruby-forum.com/.
     
    E. Saynatkari, Mar 2, 2006
    #8
  9. Hi,

    In message "Re: Confusion Over Keyword Arguments"
    on Thu, 2 Mar 2006 09:32:41 +0900, "E. Saynatkari" <> writes:

    |We are running out of characters, could we instead switch to
    |be the very first fully Unicode language? Have the actual
    |lambda sign for lambdas, the sigil for symbols and so on.. :)

    Too late. Perl6 took that place.

    matz.
     
    Yukihiro Matsumoto, Mar 2, 2006
    #9
  10. Mr. Big

    Jay Levitt Guest

    On Thu, 2 Mar 2006 08:46:23 +0900, Yukihiro Matsumoto wrote:

    > No, we don't have to. The colon can be ugly with symbols, for
    > example,
    >
    > db.find(order: :date)
    >
    > is not good looking. Any other proposal (except for "=')?


    If the keyword has to be unadorned, and this has to be done solely through
    an infix operator, how about:

    db.find (order ~> :date)
    db.find (order -> :date)

    If it's ok to adorn the keyword, and the parser can distinguish these, that
    opens up lots of options:

    db.find ([order] = :date)
    db.find (|order| = :date)
    db.find (-order- = :date)
    db.find (/order/ = :date)
    db.find (#order# = :date)
    db.find (#order = :date)

    I've got no clue how the parser works, so these may be non-starters for
    various reasons.

    Jay Levitt
     
    Jay Levitt, Mar 2, 2006
    #10
  11. Mr. Big

    Mike Stok Guest

    On 1-Mar-06, at 7:40 PM, Yukihiro Matsumoto wrote:

    > Hi,
    >
    > In message "Re: Confusion Over Keyword Arguments"
    > on Thu, 2 Mar 2006 09:32:41 +0900, "E. Saynatkari"
    > <> writes:
    >
    > |We are running out of characters, could we instead switch to
    > |be the very first fully Unicode language? Have the actual
    > |lambda sign for lambdas, the sigil for symbols and so on.. :)
    >
    > Too late. Perl6 took that place.


    Does Perl 6 exist yet? (Yes I know Pugs exists, but Perl 6 seems to
    always be about two years away ;-)

    Mike

    --

    Mike Stok <>
    http://www.stok.ca/~mike/

    The "`Stok' disclaimers" apply.
     
    Mike Stok, Mar 2, 2006
    #11
  12. Mr. Big

    Trans Guest

    I don't think anything works like ':' does --it has a divisor quality.
    So as long as a symbol is denotated with a prefix ':' there's the
    symptom of non-intuitiveness involved.

    So short of changing the symbol prefix --I was just playing with a
    space+period idea, in fact

    db.find( order: .date )

    How does allowing

    db.find( order::date )

    and deprecating ::'s previous meaning, work out?

    T.
     
    Trans, Mar 2, 2006
    #12
  13. Mr. Big

    Adam Shelly Guest

    On 3/1/06, Jay Levitt <> wrote:
    > On Thu, 2 Mar 2006 08:46:23 +0900, Yukihiro Matsumoto wrote:
    >
    > > No, we don't have to. The colon can be ugly with symbols, for
    > > example,
    > >
    > > db.find(order: :date)
    > >
    > > is not good looking. Any other proposal (except for "=3D')?

    >
    > If the keyword has to be unadorned, and this has to be done solely throug=

    h
    > an infix operator, how about:
    >
    > db.find (order ~> :date)
    > db.find (order -> :date)
    >


    How about using Pascal for inspiration? Keep both the : folks and the
    =3D crowd happy...

    db.find (order :=3D :date)


    -Adam
     
    Adam Shelly, Mar 2, 2006
    #13
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. David Konerding
    Replies:
    0
    Views:
    424
    David Konerding
    Sep 10, 2003
  2. Edward Diener
    Replies:
    14
    Views:
    4,965
    Josiah Carlson
    Apr 6, 2004
  3. Replies:
    6
    Views:
    457
    Peter Otten
    May 10, 2007
  4. Hamilton, William

    RE: keyword checker - keyword.kwlist

    Hamilton, William, May 10, 2007, in forum: Python
    Replies:
    4
    Views:
    355
  5. Peter Motzfeldt
    Replies:
    1
    Views:
    151
Loading...

Share This Page