src = Clipboard.get.split("\n") src.each do |e| p e puts e puts end
みたいなコードを書いているときに、p
だと正しく表示されるけどputs
だと後ろの文字列が一緒に表示されてしまうときがあった。
# クリップボードの内容は"foo\nbar\nbaz\n"とする "foo" foo bar baz "bar" bar baz "baz" baz
調べていくと、C言語内でmrubyの文字列を参照しているときにmrb_string_value_ptr()
を使っているのが原因だった。NULL終端された文字列が確実に欲しいときはmrb_string_value_cstr()
を使う必要がある。
- Make sure that mrb_string_value_ptr() returns a null-terminated string. by sdottaka · Pull Request #2673 · mruby/mruby
- use mrb_string_value_cstr() instead of mrb_string_value_ptr() · Issue #9 · iij/mruby-env
慌ててRubyPico全体をgrepして、ひととおりmrb_string_value_cstr()
に変更した。結構あったのに、意外とちゃんと動いていてびっくり。
後でSketchWaltz側も直しておこう。
※ このバグは申請中のRubyPico 0.9.7 で直ります