Berücksichtigung der Hash-Syntax von Ruby 1.9?

  • Obwohl ich bereits seit einiger Zeit Ruby 1.9 verwende, entdeckte ich erst kürzlich die neuere unterstützte Hash-Syntax:

     settings = {
      host: "localhost",
      port: 5984
    }
     

    Im Gegensatz zu:

     settings = {
      "host" => "localhost"
    }
     

    Ich mag seine Ähnlichkeit mit Die Objektnotation von JavaScript ist ein bisschen wie JSON, daher werde ich wahrscheinlich auf alle meine Bibliotheken zurückgreifen, aber ich möchte trotzdem andere Benutzer und meine eigenen Projekte unterstützen, die die alte Syntax verwenden.

    Es kommt also auf die recht einfache Frage an, ob Sie beide Symbole und Zeichenketten testen müssen. Gibt es eine einfache Möglichkeit, diese beiden Zeilen als eine zu machen?

     return true if settings["host"] and settings["db"]
    
    return true if settings[:host] and settings[:db]
     
    22 November 2011
    Cera
3 answers
  • Auch in Ruby & lt; 1.9 können Sie Symbole für Schlüssel verwenden. Zum Beispiel:

     # Ruby 1.8.7
    settings = { :host => "localhost" }
    puts settings[:host] #outputs localhost
    settings.keys[0].class # => Symbol
     

    Ruby 1.9 ändert die Art und Weise, wie Sie Hashes erstellen. Er nimmt den Schlüssel und wandelt ihn in ein Symbol für Sie um, wobei keine Hashrakete mehr erforderlich ist.

    > Wenn ich versuche, mit settings["name"] auf settings[:name] zuzugreifen, bekomme ich in beiden Fällen nichts. Alles, was Ruby 1.9 benötigt, ist eine neue Art, Hashes zu erstellen. Um Ihre Frage zu beantworten, können Sie meines Wissens nicht die neue {key: value} -Syntax verwenden, wenn Sie eine Rückwärtskompatibilität mit Ruby 1.8.

    möchten
    22 November 2011
    Sean Hill
  • ActiveSupport (von Rails) bietet HashWithIndifferentAccess . Sie müssen es explizit anstelle eines Standard-Hash verwenden.

    Beachten Sie jedoch ein Zitat aus der Klasse selbst:

    Diese Klasse hat eine zweifelhafte Semantik und wir haben sie nur, damit Leute anstelle von params ['key'] params [: key] schreiben können und für beide Keys den gleichen - Wert erhalten.

    17 April 2013
    Bo Jeanes
  • Es kommt also auf die recht einfache Frage an, ob Sie beide Symbole und Strings testen müssen. Gibt es eine einfache Möglichkeit, diese beiden Zeilen als eine zu machen?

     return true if settings["host"] and settings["db"]
    return true if settings[:host] and settings[:db]
     

    Ich bin nicht sicher, was Sie wirklich fragen, da dies nicht unbedingt mit dem Originaltitel zusammenhängt, versuchen Sie es jedoch:

     # somewhere you get the values you are going to need to look up...
    host = 'foo'
    db = 'bar'
    # then code goes by...
    return true if settings[host.to_sym] and settings[db.to_sym]
    
    # later you assign a symbol to one of the keys:
    host = :foo
    # more code goes by...
    return true if settings[host.to_sym] and settings[db.to_sym]
     

    Es ist alles dasselbe. Lassen Sie Ruby nach Bedarf von Zeichenfolgen zu Symbolen wechseln.

    Dies funktioniert, weil:

     'foo'.to_s   # => "foo"
    :foo.to_s    # => "foo"
    'foo'.to_sym # => :foo
    :foo.to_sym  # => :foo
     

    Sie wählen aus, ob Sie Symbole oder Zeichenfolgen für Hash-Schlüssel verwenden möchten, und lassen Sie Ruby das Problem lösen.

    22 November 2011
    the Tin ManEqbal