2017-05-19 3 views
2

私が理解する限り、シンボルは文字列のメモリフットプリントを減らす方法です。したがって、機能的には:firefoxはすべて"firefox"に相当するはずです。ルビーでは、文字列で置き換えられないシンボルはありますか?

しかし、セレンの結合のいくつかでは、これは当てはまらないようです。

https://github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings

driver = Selenium::WebDriver.for :remote, desired_capabilities: :firefox 

私はその呼び出しに"firefox":firefoxを交換した場合、私はエラーを取得します。このシンボルは、実際にはメモリ効率の良い文字列ではありませんか?

答えて

3

String sおよびSymbol sが直接等しいことはありません。クラスの違いは、しかし

:my_label.to_s == "my_label" 

AルビーSymbolつ以上の方法では重要であり、かつ

:my_label != "my_label" 

を含め、いくつかの方法で、Stringよりも効率的である:

  • Symbolハッシュと比較が速く、ハッシュキーとして使用するときに役立ちます。

  • Symbolを複数回使用すると、内部データのコピーは作成されませんが、メモリ内の同じオブジェクトへのポインタと同じです。これは、あなたが同じ価値を持っているときに、メモリを効率的にします。

ライブラリは、のようなSelenium::WebDriverがパラメータとして記号を使用する場合、あなたは常に同等の文字列に置き換えることができません。あなたがそのように扱うことができるかどうかは、特定のライブラリに依存します。 SymbolStringにキャストするのは比較的簡単です。その逆もありますので、多くのライブラリがキャストを行います。 String paramが必要な場合は、param = param.to_sのライブラリコードを持つことは非常に一般的です。StringからSymbolにキャスト

あまり一般的であるため長いRubyが参照されていないSymbolオブジェクトをガベージコレクトないしばらくの間、ライブラリコードに見られる - と等価Symbolものに任意String値を変換メモリリークを得るための方法であった(及び攻撃者があなたのプログラムをクラッシュさせるためのベクトル)。

2

シンボルは、データ型です。

Selenium::WebDriver.forメソッドは引数を受け取り、おそらくハッシュ値がシンボルであると想定します。私はクラスと一緒に働いたことがなく、forの最後の引数がハッシュかkwargsかどうかはわかりませんが、あなたは考えました:データ型の問題です。

"間違った"データ型を渡すと、エラーが発生します。

+1

いくつかの図書館は両方を受け入れる努力をしていますが、はい、それは全く自動ではありません。 Railsは人々を騙します:) –

+2

'4 'は' '4.0と同じではありません' 'と同じではありません4:'は ':と同じではありません4"は '[4]'と同じではありませんと同じ ... – Phrogz

0

次IRB転写参照、文字列とシンボルの違いを表示するには:Rubyで

irb(main):007:0> "firefox" 
=> "firefox" 
irb(main):008:0> "firefox".to_sym 
=> :firefox 
irb(main):009:0> "firefox".class 
=> String 
irb(main):010:0> "firefox".to_sym.class 
=> Symbol 
関連する問題