2018/03/05(月) [n年前の日記]
#2 [ruby][dxruby] RubyのOpalで少しハマったかもしれず
DXRuby で動いていたスクリプトを DXOpal で動かしたら謎のエラーが出て悩んでしまった。
どうも、ハッシュのキーを配列で返してくれる、Hash#keys が、Opal では動かない気配がする…。いや、もしかすると、自前で(?)JSON からハッシュに変換した際に妙なことになったのかもしれないけど。
更に加えて、以下の記述もエラーになった。
_Hashのキーを文字列からシンボルに変換する - Qiita
どうも Opal のハッシュ関係は、未実装な部分があるか、あるいは動作が元々の Ruby と何か違っている状態なのかもしれない…。いや、もしかすると、自前で(?)JSON からハッシュに変換した際に妙なことに以下略。ちょっと自信無し。
何にせよ、素直な書き方をしてる分にはOpal上でも動くけど、どこかRubyらしい変態チックな書き方をし始めると、Opal上では動かなくなる可能性があったりするのかもしれないなと思えてきたりもして。
どうも、ハッシュのキーを配列で返してくれる、Hash#keys が、Opal では動かない気配がする…。いや、もしかすると、自前で(?)JSON からハッシュに変換した際に妙なことになったのかもしれないけど。
更に加えて、以下の記述もエラーになった。
_Hashのキーを文字列からシンボルに変換する - Qiita
Hash[ h.map{|k,v| [k.to_sym, v] } ]
どうも Opal のハッシュ関係は、未実装な部分があるか、あるいは動作が元々の Ruby と何か違っている状態なのかもしれない…。いや、もしかすると、自前で(?)JSON からハッシュに変換した際に妙なことに以下略。ちょっと自信無し。
何にせよ、素直な書き方をしてる分にはOpal上でも動くけど、どこかRubyらしい変態チックな書き方をし始めると、Opal上では動かなくなる可能性があったりするのかもしれないなと思えてきたりもして。
◎ 文字列のキーをシンボルのキーに変換したいのだけど。 :
JSON を読み込んでハッシュにすると、キーが全部、文字列になってしまう。シンボルのキーにしたいのだけど…。
Ruby の _JSONライブラリ を使えるなら、オプションの :symbolize_names に true を指定してやれば変換してくれるのだけど。DXOpal の場合、そういうことはできない予感。おそらく JSONライブラリ自体が使えない状態であろう気もする。
となると、自前で変換しないといけないわけだけど。おそらく今後も何度かそういう処理をすることになるだろうから、文字列やシンボル名を決め打ちにして処理せずに、汎用性がある関数にできれば…。
いや、以下の記事によると、あまり気にしなくてもいいのかな。シンボルのほうが速くなるのだろうと思ったけど、昔ならともかく最近はそうでもないようだし。
_HashキーのStringアクセスとSymbolアクセスのパフォーマンス比較 - Hack Your Design!
少し話はずれるけど。Ruby 2.5 は、ハッシュのキーを文字列からシンボルに変換する機能を標準で持っているらしい。
_Ruby の Hash のキーを Symbol に変更する - Secret Garden(Instrumental)
調べているうちに、ふと思った。一般的なプログラミング言語では、ハッシュのキーを文字列にしてあるのが普通で、シンボルにして扱うなんて特殊だよなと。処理速度的に大きなメリットがあるならともかく、たいして変わらないのであれば、キーは文字列のままでいいんじゃないか…。
ということで、一旦はキーをシンボルに変換する処理を書いていたけど、やっぱり文字列のまま扱うことにしてしまったり。
Ruby の _JSONライブラリ を使えるなら、オプションの :symbolize_names に true を指定してやれば変換してくれるのだけど。DXOpal の場合、そういうことはできない予感。おそらく JSONライブラリ自体が使えない状態であろう気もする。
となると、自前で変換しないといけないわけだけど。おそらく今後も何度かそういう処理をすることになるだろうから、文字列やシンボル名を決め打ちにして処理せずに、汎用性がある関数にできれば…。
いや、以下の記事によると、あまり気にしなくてもいいのかな。シンボルのほうが速くなるのだろうと思ったけど、昔ならともかく最近はそうでもないようだし。
_HashキーのStringアクセスとSymbolアクセスのパフォーマンス比較 - Hack Your Design!
少し話はずれるけど。Ruby 2.5 は、ハッシュのキーを文字列からシンボルに変換する機能を標準で持っているらしい。
_Ruby の Hash のキーを Symbol に変更する - Secret Garden(Instrumental)
調べているうちに、ふと思った。一般的なプログラミング言語では、ハッシュのキーを文字列にしてあるのが普通で、シンボルにして扱うなんて特殊だよなと。処理速度的に大きなメリットがあるならともかく、たいして変わらないのであれば、キーは文字列のままでいいんじゃないか…。
ということで、一旦はキーをシンボルに変換する処理を書いていたけど、やっぱり文字列のまま扱うことにしてしまったり。
[ ツッコむ ]
以上です。