ããã«ã¡ã¯ãruby-devãã¼ã ã®é è¤ï¼@mametterï¼ã§ãã Among Usã¨ããã²ã¼ã ããã£ã¦ãã®ã§ãããåéãå°ãªãã¦ãã¾ãéå¬ã§ããªãã®ãæ©ã¿ã§ãã
仿¥ã¯ãRuby 3.1ã«å°å ¥ãããäºå®ã®error_highlightã¨ããæ©è½ãç´¹ä»ãã¾ãã
ã©ããªæ©è½ï¼
NoMethodErrorãèµ·ããã¨ããæ¬¡ã®ãããªè¡¨ç¤ºãåºãããã«ãªãã¾ãã

ã©ãã®ã¡ã½ããå¼ã³åºãã§å¤±æããããä¸ç®çç¶ã§ãããããã ãã®æ©è½ã§ããã使ã£ã¦ã¿ãã¨æå¤ã¨ä¾¿å©ã§ãã
ããå°ã詳ãã
ãã®æ©è½ãæ¬é ãçºæ®ããã®ã¯ãRailsã®paramsãJSONãã¼ã¿ã®åãæ±ããªã©ã®ã¨ãã§ãã
ãã¨ãã°json[:articles][:title]ã¿ãããªã³ã¼ããæ¸ãã¦ãundefined method '[]' for nil:NilClassã¨ããä¾å¤ãåºãã¨ãã¾ãã
ãã®ã¨ãã夿°jsonãnilã ã£ãã®ããjson[:articles]ã®è¿ãå¤ãnilã ã£ãã®ãã¯ãæ®å¿µãªããã³ã¼ãã ãè¦ã¦ã夿ã§ãã¾ããã
ç¹å®ããã«ã¯ããããã°åºåãæãã§åå®è¡ããå¿
è¦ãããã¾ããã
error_highlightãããã¨ããããã²ã¨ç®ã§å¤å¥ã§ãã¾ãã
$ ruby test.rb
test.rb:2:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
title = json[:articles][:title]
^^^^^^^^^^^
âã¯ãjsonãnilã ã£ãã±ã¼ã¹ã§ãã
$ ruby test.rb
test.rb:2:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
title = json[:articles][:title]
^^^^^^^^
âã¯ãjson[:articles]ãnilãè¿ãããã¨ããããã¾ãã
å®è£ ã«ã¤ãã¦
error_highlightã¯Rubyã¤ã³ã¿ããªã¿ã®å®è£ ã«æ·±ãé¢ãã£ã¦ã¾ãããã£ããã¤ã¡ã¼ã¸ã§ç´¹ä»ãã¾ãã
Rubyã¯ãããã°ã©ã ãæ½è±¡æ§ææ¨ã«å¤æããããããã¤ãã³ã¼ãã«ã³ã³ãã¤ã«ããä¸ã§å®è¡ãã¦ãã¾ãã
ãã¨ãã° json[:articles][:title] ã¨ããã³ã¼ãã¯ã次ã®ãããªæ½è±¡æ§ææ¨ï¼ã¤ã¡ã¼ã¸ï¼ã«å¤æããã¾ãã

ããããã®åè§ã¯æ½è±¡æ§ææ¨ã®ãã¼ãã表ãã¾ãããã¼ãã¯ãã¡ã½ããåãªã©ã®ä»å æ å ±ããã¬ã·ã¼ãã弿°ãªã©ã®åãã¼ãã¸ã®åç §ãæã¡ã¾ããããã«å ãããã¼ãã¯"ID"ã¨"column"ã¨ããæ å ±ãæã£ã¦ãã¾ãã"ID"ã¯ãã¼ãã䏿ã«ç¹å®ããçªå·ã§ãã"column"ã¯ããã®ãã¼ãã«å¯¾å¿ããã³ã¼ãã®ç¯å²ã表ãã¦ãã¾ã*1ã
ããããããã®æ½è±¡æ§ææ¨ãããããæ¬¡ã®ãããªãã¤ãã³ã¼ãï¼ã¤ã¡ã¼ã¸ï¼ã«ã³ã³ãã¤ã«ãã¾ããRubyã®VMã¯ã¹ã¿ãã¯ãã·ã³ã§ãã¾ããªãã¨ãªãèªãããã¨æãã¾ã*2ã
1: getlocal :json # ID: 3 2: putobject :articles # ID: 4 3: send :[] # ID: 2 4: putobject :title # ID: 5 5: send :[] # ID: 1
ãã®ã¨ããåå½ä»¤ãç±æ¥ã¨ãªã£ããã¼ãã®IDãæã£ã¦ããã®ãRuby 3.1ã§æ°ãã«å®è£ ããã¨ããã§ãerror_highlightã®èã«ãªãã¾ãã
json[:articles]ãnilãè¿ããnilã«å¯¾ãã¦[]ã¡ã½ãããå¼ãã§ãã¾ã£ãå ´åã5çªç®ã®sendå½ä»¤ã失æãã¾ãããã®ã¨ãã5çªç®ã®å½ä»¤ã¯"ID: 1"ã¨ããåç
§ãæã£ã¦ããã®ã§ãã©ã®ãã¼ãã§å®è¡å¤±æããã®ãããããã¾ããããã¦ãæ½è±¡æ§ææ¨ã®ãã¼ãã«ã¯"column"æ
å ±ãããã®ã§ãã³ã¼ãä¸ã®ã©ã®ç¯å²ã§ã¨ã©ã¼ãèµ·ãããã¨ããæ
å ±ãå¾ããã¨ãã§ãã¾ãã
ID 1ã®ãã¼ãã®column㯠0...23 ã¨ãªã£ã¦ãã¦ããã㯠json[:articles][:title] ã¨ããæååå
¨ä½ã®ç¯å²ã«å¯¾å¿ãã¦ãã¾ãããã®å
¨ä½ã«ä¸ç·ãå¼ãã¨ã©ãã§ã¨ã©ã¼ãèµ·ããããããã«ããã®ã§ãerror_highlightã¯ãªãã¹ãã¡ã½ããåã®ä½ç½®ãç¹å®ãã¦ç·ãå¼ãããã«ãã¦ãã¾ãã大ã¾ãã«è¨ãã°ãã¬ã·ã¼ãã®åãã¼ãã§ãã ID 2ã®ãã¼ãã®çµç«¯ããå¾ãã¤ã¾ã [:title] ã®ä¸ã«ã ãä¸ç·ãå¼ãããã«ãªã£ã¦ãã¾ãã
ã¯ã¬ã¸ããã¨è£è©±
ãã¼ãã«ã«ã©ã æ å ±ãããããããã«ããã®ã¯yui-knkããã§ãï¼RubyKaigi 2018ã®çºè¡¨ï¼ã error_highlightã®ååãyui-knkãããä½ã£ã¦ããã®ã§ãããæ¾ç½®ç¶æ ã«ãªã£ã¦ããã®ã§ãä»åé è¤ãå¼ãåã£ã¦å®æããã¾ããã
ãªãå¼ãåã£ããã¨è¨ãã¨ãRubyKaigi Takeout 2021ã§é è¤ãçºè¡¨ããTypeProf for IDEã®å®è£ ã®ããã«å¿ è¦ã ã£ãããã§ãã IDEã§ã¯ã¨ã©ã¼ç®æãã«ã©ã åä½ã§ä¸ç·ãå¼ãã¦ç¤ºãã®ãæ®éãªã®ã§ãã»ã¼åãæ©æ§ãå¿ è¦ã§ããã ãã®ããã«å¿ è¦ãªæ¡å¼µãå®è£ ããã¨ããã®ãã¾ãã¨ãã¦error_highlightãå®ç¾å¯è½ã«ãªãã¾ããã
å½ä»¤ãã¨ã«ç±æ¥ã¨ãªã£ããã¼ãIDãè¨é²ããããã«ã¯ãå¤å°ã¡ã¢ãªãæ¶è²»ãã¦ãã¾ãã¾ã*3 *4ã ããã¯ãéçºä½é¨åä¸ã¨ã®ãã¬ã¼ããªãã§ããã åå½ä»¤ã«ãã¼ãIDã§ã¯ãªãã«ã©ã ä½ç½®èªä½ããããã¦ãã¾ãæ¹æ³ãããã®ã§ãããããã¡ã¢ãªæ¶è²»éã大ãããªãã®ã§ãæ½è±¡æ§ææ¨ãçµç±ãã¦ä½ç½®ãç¹å®ããç¾å¨ã®æ¹æ³ã«ãªãã¾ããã
ãªããæ½è±¡æ§ææ¨èªä½ã¯ã¡ã¢ãªã«ä¿åããã¦ããããå¿
è¦ã«ãªã£ãæï¼ã¤ã¾ãã¨ã©ã¼ãçºçããã¨ãï¼ã«ããã¡ã¤ã«ã«ããã½ã¼ã¹ã³ã¼ããå度èªã¿è¾¼ãã§ãã¼ã¹ãç´ãã¦ãã¾ãã
ãã®ã¢ããã¼ãã§ã¯ãã½ã¼ã¹ãã¡ã¤ã«ãæ¸ãæããããå ´åãªã©ã¯ãã¼ããæ£ããåå®ã§ããªããªãå¯è½æ§ãããã¾ãã
ã¾ããevalã§å®è¡ããã¦ããã½ã¼ã¹ã³ã¼ãã«ã¤ãã¦ã¯error_highlightã¯åãã¾ããï¼ãã®ãããç¾å¨ã®ã¨ããirbã§ã¯åãã¾ããï¼ã
ç¾å¨ã®ã¨ããé ãã³ãã³ãã§ãããRubyVM.keep_script_lines = trueã¨ããã¨ãã¤ã³ã¿ããªã¿ãã½ã¼ã¹ã³ã¼ããä¿æãç¶ããããã«ãªããã½ã¼ã¹ã³ã¼ãã®åèªã¿è¾¼ã¿ã¯è¡ãããªããªããevalã«ã¤ãã¦ãerror_highlightãåãããã«ãªãã¾ãã
ã¾ã¨ã
Ruby 3.1ã§ã¯ãNoMethodErrorã®ã¨ã©ã¼è¡¨ç¤ºãã¡ãã£ã¨è¦ªåã«ãªãã¾ãã ãããããªæ¹è¯ãªã®ã§éå°ã«æå¾ ãããã¨å°ãã¾ããããRuby 3.1.0-preview1ãå®éã«ä½¿ã£ã¦ã¿ããäºæ³å¤ã«éçºä½é¨ããããªã£ããã¨ãã声ãã¡ãã»ãé ãã¦ããã®ã§ãã»ã©ã»ã©ã«ãæå¾ ãã ããã
*1:å®éã«ã¯ãã¼ãã¯ã«ã©ã çªå·ã ãã§ãªããè¡çªå·ãæã£ã¦ãã¾ãããçç¥ãã¦ãã¾ãã
*2:getlocalã¯ãã¼ã«ã«å¤æ°èªã¿åºããputobjectã¯å³å¤ãªãã¸ã§ã¯ãã®pushãsendã¯ã¡ã½ããå¼ã³åºãã§ãã
*3:æ©è½ææ¡æç¹ã®å®é¨ã§ã¯ãrails newãã¦ä½ã£ãWebã¢ããªã®ã¡ã¢ãªæ¶è²»éã97 MBãã100 MBãããã«å¢ãã¾ããã
*4:ä½è«ã§ãããã¼ãIDã®è¨é²æ¹æ³ã¯ãã¡ãã£ã¨å·¥å¤«ããã¦ãã¾ãã以忏ããè¨äºãç°¡æ½ããããã¯ãã«ã§Rubyãlog Nåéããããããåç §ãã ããã