2016-12-06 6 views
1

私は、Ruby in Rails 4.0で、Railsはシンボルまたは文字列のいずれかのキーを使って、HashWithIndifferentAccessクラスを使ってハッシュの値を参照できることを学んでいます。たとえば、paramsハッシュは、シンボルまたは文字列を使用して参照することができます。これは、クラスがHashWithIndifferentAccessであるためです。HashWithIndifferentAccessを使用している場合の文字列とシンボル

すなわち:params["id"] and params[:id] --> both access the id in the params hash

両方が使用され、レールによって許容されることができるが、明らかにいずれかのベストプラクティス/パフォーマンス上の理由のために他のより好ましい一ありますか?私の最初の考えは、いったんそれらが格納されると、それらのメモリを保持しているという事実のためにシンボルを使用するほうが良いということでした。これは文字列とは対照的です。文字列ごとに新しいメモリが必要です。

これは間違いありませんか?あるいは、文字列や記号を使用するかどうかは本当に問題ではありませんか?

答えて

1

Rubyの文字列は可変であり、予測不可能でパフォーマンスが低下する可能性があります。これらの理由から、RubyではSymbolsの選択肢も提供しています。大きな違いは、シンボルは不変であるということです。変更可能なオブジェクトは変更可能ですが、変更可能なオブジェクトは上書きのみ可能です。シンボルはメモリの方がうまく機能し、パフォーマンスが向上しますが、十分に注意しないと、アプリのメモリ使用量が増えます。

文字列または記号を使用すると、アプリケーションの全体的な健全性とパフォーマンスに役立つ両方の用語とその目的を理解することができます。これは、Stringをどこで使うべきか、Symbolをどこで使うのかという厳密な定義がないのかもしれない理由です。内部識別子、

  • 文字列を変更することを意図していない変数 - - 変更または
  • をプリントアウトされている変数

    • 記号:私は多分どこ推奨されているもののガイダンスとして与えるだろう何

      HashWithIndifferentAccessは、内部的にすべてのシンボルを文字列にマッピングします。

      h = ActiveSupport::HashWithIndifferentAccess.new(test: 'test') 
      

      あなたが作成したハッシュ(H)のキーを取得しようとする場合は、文字列

      h.keys # => ["test"] 
      
    +0

    'HashWithIndifferentAccess'がすべてのシンボルを文字列にマッピングすることを終えるとしたら、それは問題ではありませんか? – the12

    +1

    詳細については、「HashWithIndifferentAccess」を使用して文字列を使用すると、SymbolからStringへのキャストを避けるために少しだけパフォーマンスが向上すると言えます。 –

    0

    カップルのハイライト:

    まず、Rubyの2.3のように、文字列の不変性(メモリ内の同じ場所に同じ内容のポイントを持つオブジェクト)はオプションです。私が理解していることから、この機能はRuby 3.0のデフォルトになります。ここでは例です:

    # frozen_string_literal: true 
    
    a = 'foo' 
    b = 'foo' 
    
    puts a.object_id 
    puts b.object_id 
    
    puts a.equal?(b) 
    

    ファイル名を指定して実行ファイル:

    ➜ ruby test.rb 
    70186103229600 
    70186103229600 
    true 
    

    第二に、シンボルは(this popular styleガイドを参照してください)ハッシュキーとして好ましい一般です。

    HashWithIndifferentAccessの詳細については、here's a good blog postをご覧ください。短いバージョンでは、すべてのキーが裏の文字列に変換されます。

    +0

    としてキーを取得します私は間違いなくシンボルは、純粋なRubyでハッシュキーとして好まれていることを理解しています。私の質問は、Railsクラスの 'HashWithIndifferentAccess'と関係しています。 Railsがシンボルと文字列の両方をどのように扱うか、また、どちらが優先されるかどうかについては興味があります。 – the12

    +0

    あなたをフォローしていません。あなたは「シンボルが優先されていることを理解している」と書いています。 – sixty4bit

    +0

    また、 'HasWithIndifferentAccess'がどのように動作するかについて、最後に少し追加しました。 – sixty4bit

    関連する問題