- 【Python】スクリプト バトルロワイヤル47【pl,rb,php,js】 [転載禁止]©2ch.net
962 :デフォルトの名無しさん[sage]:2015/02/25(水) 21:37:40.85 ID:7GkgvnFA - >>907
>> 変数 foo をグローバルな名前空間上で宣言しなければならない >Symbol.for('foo') もグローバルな名前空間を汚染していることに気付いていないのか? >var Symbol = { "for": "foo" } としているのと実質的に同じだぞ。 遅レスになったが、Symbol.for('foo') はグローバルな名前空間を汚染しない JS のシンボル Symbol は組込み型だけど、あえて「実質的に同じ」コードを書くと、以下になる var __internal_symbol_table__ = { "foo": "foo" } ここで新たにシンボル bar が宣言されると、この(JS ランタイム内部に存在する)表は以下のよう変化する var __internal_symbol_table__ = { "foo": "foo", "bar": "bar" } JS のシンボルについてあまりに無知すぎるから、以下を読んで勉強したほうがいいね ・Symbolについて - JS.next http://js-next.hatenablog.com/entry/2014/03/01/001650 この記事内にある「シンボルを登録する」という節で、コンストラクタ Symbol('foo') と メソッド Symbol.for('foo') との違いが詳しく解説されている
| - 【Python】スクリプト バトルロワイヤル47【pl,rb,php,js】 [転載禁止]©2ch.net
964 :デフォルトの名無しさん[sage]:2015/02/25(水) 21:46:02.29 ID:7GkgvnFA - >>930
>通常のプログラミングでシンボルのせいでメモリが枯渇することはありえないし、 ありえないのなら、シンボルCGの導入も不要だったはずだよね ところが、ありえる事が明らかになって、深刻な問題であると認識されたのが「シンボルDoS」攻撃(>>872) 「枯渇するまでにはサーバーが再起動されている」とお花畑なこと言ってるくらいだから知らないのだろね 以下で詳しく解説されているから、読んで勉強したほうがいいと思うよ ・(翻訳) Ruby 2.2 のシンボル GC | FIVETEESIXONE http://fiveteesixone.lackland.io/2015/01/21/symbol-gc-ruby-2-2/ あと以下の箇所は間違いだったから、訂正しておく X: メモリが枯渇する O: メモリ確保失敗による実行時エラーが発生する $ ruby2.1 -e 'p :foo.__id__; 10000000.times {|i| "foo#{i}".to_sym}; p :foo.__id__' 146328 -e:1:in `to_sym': symbol table overflow (symbol foo2094525) (RuntimeError) >むしろ大規模なRailsアプリで一番の問題だったのは、速度でもメモリ使用量でもなく、ガベージコレクションによる停止時間。 >これもシンボルは直接の原因ではない。 >>928 で書いたのは、シンボルGCが導入された「いきさつ」だよ それを>>928 の最後に書いたのだけど、読めなかったのかな???(困惑 そして、シンボル以前に Ruby のGC実装そのものに性能問題が多いことは良く知られていたし、 その一方でバージョンアップのたびに問題は改善された そして遂には他言語を圧倒するほど効率的になったのは、しばらく前にこのスレで話題になったばかり(>>753) そんな当たり前の話を今さら強調するという感覚がよく分からんな???(大困惑
| - 【Python】スクリプト バトルロワイヤル47【pl,rb,php,js】 [転載禁止]©2ch.net
970 :デフォルトの名無しさん[sage]:2015/02/25(水) 23:16:07.34 ID:7GkgvnFA - >>938,939,940 (ID: flmNpp9d)
>単に記述が簡易なのと これは「多用される理由」ではなくて、「(文字列の亜種として (>>880))誤用される理由」 >辞書の { キー: 値 } 記法を使ったら嫌でもキーがSymbolになってしまう これもすでに >>944 が指摘しているけど、{ シンボル => 値 } の単なる構文糖 >メソッドを動的に定義したり取得したりするのにSymbolしか使えないから シンボルの本質は「ソースコード上の識別子を表す(>>866,928)」なのだから、 メソッドの動的定義で渡すメソッド名としてシンボルを用いるのは、まさに正しい使い方だよ (>>944 の言う「本来のSymbolの役割」) これを文字列とシンボルのどちらでもかまわないという(型付けの弱い)発想は、 Ruby プログラミングにおける「暗黙の常識」(>>928) に反している >書き忘れてたけどRubyでSymbolが多用される大きな理由の一つに「Stringがミュータブルだから」というのがある >キーとしてミュータブルなオブジェクトを使用すると外から書き換えられてハッシュがぶっ壊れる恐れがあるからね これまた >>944 が指摘しているように組込みメソッド Object#dup を使う方法があるし、あるいは もし「イミュータブルなString」が必要ならば組込みメソッド Object#freeze を使えばいい http://docs.ruby-lang.org/ja/2.2.0/method/Object/i/freeze.html Object#freeze は String オブジェクト内部の属性値を更新するだけだから、 Object#to_sym のように無駄な Symbol オブジェクト生成もいらない だから「Stringがミュータブルだから」という理由は間違い もう少し Ruby について勉強し直してから、出直したほうがいいと思うよ
| - 【Python】スクリプト バトルロワイヤル47【pl,rb,php,js】 [転載禁止]©2ch.net
971 :デフォルトの名無しさん[sage]:2015/02/25(水) 23:41:20.55 ID:7GkgvnFA - >>965
> もちろん、その空間はリードオンリーの Symbol しか存在しないから、実害はないけれど。 いや、実害が無いのは、シンボル宣言によって消費される名前空間(=シンボル表)を 変数やメソッドが属する一般的な名前空間から分離しているからだよ そして実害が無いことが重要だ 名前空間の分離という発想が、異なる JS パッケージ間で名前が衝突するという 古い JS 仕様が抱えていた名前汚染問題の解決方法になった もう少し「JS における名前汚染問題」について勉強したほうがいいと思う
|
|