æè¡é¨ã®ç¬¹ç°ï¼ko1ï¼ã¨é è¤ï¼mameï¼ã§ããã¯ãã¯ããã㧠Ruby (MRI: Matz Ruby Implementationããããã ruby ã³ãã³ã) ã®éçºããã¦ãã¾ãããéãããã£ã¦ Ruby ãéçºãã¦ããã®ã§ããã® Ruby ã³ããã¿ã§ãã
å»å¹´ã®è¨äºãããã¨èªã¿è§£ã Ruby 2.6 NEWS ãã¡ã¤ã«ãã«ç¶ããä»å¹´ãæ¬æ¥ 12/25 ãªãªã¼ã¹äºå®ã® Ruby 2.7 ã® NEWS ãã¡ã¤ã«ã®è§£èª¬ããã¦ã¿ããã¨æãã¾ããNEWS ãã¡ã¤ã«ã¨ã¯ä½ããã¨ããã®ã¯å»å¹´ã®è¨äºãè¦ã¦ä¸ããã
å®ã¯æè¿ãNEWS ãã¡ã¤ã«ãèªã¿ãããããããã¨ä¾ãå
¥ããããã¦ãã¦ã以åã®ãã®ã«æ¯ã¹ã¦èªã¿ãããã¯ãªã£ã¦ãã¾ãï¼è±èªã ãã©ï¼ãè¨äºä¸ã®ã³ã¼ãããNEWS
ãã¡ã¤ã«ããå¼ç¨ãã¦ãããã®ãããã¾ããæ¬è¨äºã§ã¯ãå¤æ´ã®è§£èª¬ã«å ããå·çè
ããéçºã«æºãã£ã¦ããã¨ãããã¨ãæ´»ããã¦ãããªãå¤æ´ãå
¥ã£ãã®ããã¨ããèæ¯ãããããç¯å²ã§ç´¹ä»ãã¦ããã¾ãã
Ruby 2.7 ã¯ãæ¥å¹´ 2020 å¹´ã«ãªãªã¼ã¹äºå®ã® Ruby 3 ã¸ç§»è¡ããããã«ãããããå¤ãã®å¤æ´ãå ¥ã£ããªãªã¼ã¹ã§ããã¾ãããã¤ãã®ããã«ã便å©ãªæ°æ©è½ãæ§è½åä¸ãåãè¾¼ã¾ãã¦ãã¾ããçµæ§ãçãã ãããã«ãªãã¾ãããã楽ãã¿ä¸ããã
ä»ã«ã Ruby 2.7 ã解説ãã¦ããè¨äºãããã¾ããæã ãè¦ã¤ãããããã®ã ããç´¹ä»ããåèã«ãªãã£ã¦ä¸ããã
- Ruby 2.7 Advent Calendar 2019 - Qiita
- ãµã³ãã«ã³ã¼ãã§ãããï¼Ruby 2.7ã®ä¸»ãªæ°æ©è½ã¨å¤æ´ç¹ Part 3 - æ°æ©è½ã¨å¤æ´ç¹ã®ç·ã¾ã¨ã - Qiita
è¨èªã®å¤æ´
ææ³ãªã©ãããã°ã©ãã³ã°è¨èª Ruby ã®æå³ãªã©ã«ã¤ãã¦ã®å¤æ´ã§ãã
ãã¿ã¼ã³ããã
- Pattern matching is introduced as an experimental feature. [Feature #14912]
ãã¼ã¿æ§é ãããæãã«ãã§ãã¯ã»å解ããæ©è½ãå ¥ãã¾ããã
ãã¿ã¼ã³ãããã¨ã¯
case {a: 0, b: 1, c: 2} in {a: 0, x: 1} :unreachable in {a: 0, b: var} p var #=> 1 end
ä¸è¦ããã¨ãè¦æ
£ããcase
/when
ã®ããã«è¦ãã¾ãããcase
/in
ãªã®ã§æ°æ§æã§ããæå³ãcase
/when
ã¨ä¼¼ã¦ãã¦ã{a: 0, b: 1, c: 2}
ã®å¤ã«ãããã¿ã¼ã³ãä¸ããæ¢ãã¦ããã¾ãã
in {a: 0, x: 1}
ã¯ããã¼a
ãåå¨ãããã®å¤ã¯0ã§ãªããã°ãã¡ããã¤ããã¼x
ãåå¨ãããã®å¤ã¯1ã§ãªããã°ãã¡ãã¨ãããã¨ã表ç¾ãã¦ãã¾ãã
{a: 0, b: 1, c: 2}
ã¯1ã¤ãã®æ¡ä»¶ã¯æºããã¦ãã¾ãããx
ããªãã®ã§ããã®ãã¿ã¼ã³ã«ã¯ããããã¾ããã
ãããããªãã£ãã次ã®ãã¿ã¼ã³in {a: 0, b: var}
ã調ã¹ã¾ããããã¯ããã¼a
ãåå¨ãããã®å¤ã¯0ã§ãªããã°ãã¡ããã¤ããã¼b
ãåå¨ãããã®å¤ã¯ãªãã§ãããã®ã§å¤æ°var
ã«ä»£å
¥ãã¦ãã¨ãããã¨ã表ç¾ãã¦ãã¾ãã
ããã¯ä¸¡æ¹ã®æ¡ä»¶ãæºããã®ã§ãããããvar
ã«1ã代å
¥ããä¸ã§ããã®ä¸ã®ç¯ï¼ããã§ã¯p var
ï¼ãå®è¡ãããã¨ãããã¨ã«ãªãã¾ãã
ããã©ã®ãã¿ã¼ã³ã«ããããããªãã£ãããNoMatchingPatternError
ä¾å¤ãæãããã¾ããããã¯case
/when
ã¨éãã®ã§æ³¨æãã¦ãã ããã
å
·ä½çãªã¦ã¼ã¹ã±ã¼ã¹ã¨ãã¦ã¯ãJSONãã¼ã¿ãæå¾
ããæ§é ã«ãªã£ã¦ããããã§ãã¯ããããããå¿
è¦ãªãã¼ã¿ãä¸æ°ã«åãåºããã¨ãããããªã¨ãã«ä½¿ããã§ãããããã#dig
ã«é ¼ããªãã¦ããããã ã
json = <<END { "name": "Alice", "age": 30, "children": [{ "name": "Bob", "age": 2 }] } END JSON.parse(json, symbolize_names: true) in {name: "Alice", children: [{name: child_name, age: age}]} p child_name #=> "Bob" p age #=> 2
ãã¿ã¼ã³ãããã®è©³ç´°ã説æãã ãã¨é·ãã®ã§ã詳ããã¯Rubyã®ãã¿ã¼ã³ããããè¨è¨ã»å®è£ ããè¾»æ¬å樹ããã«ããè³æãè¦ã¦ãã ããï¼ã¡ãã£ã¨å¤ãã¨ãããããã¾ãï¼ã
ãã¿ã¼ã³ãããå°å ¥ã®ä½ãå°é£ã ã£ãã
ãã¦ãããããã¯å¤æ´ã®èæ¯ã§ãã
ãã¿ã¼ã³ãããã¯ä¸»ã«éçåä»ãé¢æ°åããã°ã©ãã³ã°è¨èªã§ä½¿ããã¦ããæ©è½ã§ããRubyã§æ¨¡å£ãããææ¡ããã試ä½ãããã¨ãããã¨ã¯å¤ãããè¡ããã¦ãã¦ãå¾ æããã¦ããã¨è¨ãã¾ãã
- Ruby ã§ãã¿ã¼ã³ããã: æ¢åã®Rubyæ§æã§æ¨¡å£ãã試ã¿
- Pattern Matching in Ruby:
%p{}
ãå°å ¥ããææ¡ã¨è©¦ä½ - Feature #14709 - Proper pattern matching: ä¸ã®è©¦ä½ãåãããã±ãã
- Qo - Query Object - Pattern matching and fluent querying in Ruby: Rubyæ§æã§æ¨¡å£ããã©ã¤ãã©ãª
ããããè¨èªçµã¿è¾¼ã¿ã«ãµããããæ§æããªããªãææ¡ããã¾ããã§ãããã¨ããã®ããRubyã®æ§æã¯æè»ããã¦æ¡å¼µã®ä½å°ãå°ãªãããã¨ãã£ã¦æ°ããªãã¼ã¯ã¼ããå°å
¥ããã®ã¯äºææ§ã®è¦³ç¹ã§é£ããããã®ä¸ããã¿ã¼ã³ãããã®ãã¿ã¼ã³ã¯åºæ¬çã«ãã®ãã¼ã¿ãä½ãæ§æã«ä¼¼ããã®ã«ããï¼é
åã ã£ãã[x, y, z]
ãããã·ã¥ã ã£ãã{a: x, b: y}
ï¼ã¨ããæ
£ç¿ãããããªããªãæå¾
ã«ããæ§æãçºè¦ã§ããªãã£ãã®ã§ããã
ãã®ç¶æ³ãæç ´ããã®ãè¾»æ¬ããã§ãããè¾»æ¬ããã¯in
ã¨ãããã¼ã¯ã¼ããåå©ç¨ãããã¨ãææ¡ãã¾ãããRubyã«ã¯ç¹°ãè¿ãã®æ§æfor ... in
ãããï¼ç¾ä»£ã§ã¯ã»ã¨ãã©ä½¿ãããªãæ§æã§ãï¼ããã®æ§æã®ããã«in
ã¯ãã§ã«ãã¼ã¯ã¼ãã ã£ãã®ã§ãæ°ãã«å°å
¥ããå¿
è¦ã¯ããã¾ããããã¿ã¼ã³ãããã表ç¾ãããã¼ã¯ã¼ãã¨ãã¦ãã¹ããã©ããã¯è°è«ã®ä½å°ããããã®ã®ãcase
/in
ã¨ããæ§æã¯ãããªãã«ç´æçã§ããããã¿ã¼ã³ãããå°å
¥ã®ç¾å®å³ãé«ã¾ãã¾ããã
è¾»æ¬ããã2018å¹´ã«ææ³ã¨æå³ã®ãããå°ãä½ã£ããã¨ã§è°è«ãæ¬æ ¼åãã2019å¹´ã«ãªã£ã¦å®è£ ãããRubyKaigi 2019ã®ã¿ã¤ãã³ã°ã§ã³ããããããå年以ä¸ã®å®é¨ã¨è°è«ãéãã¦ãç¡äº2.7ã«å ¥ãã¾ãã
ãã ããã¾ã ããã¾ã§å®é¨çå°å ¥ã¨ããä½ç½®ã¥ãã§ãããå©ç¨ããã¨æ¬¡ã®ããã«è¦åãåºã¾ãã
$ ./miniruby -e 'case 1; in 1; end' -e:1: warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby!
ä»å¾ãããåºã使ã£ã¦ããã£ã¦ç´°ããæ¹åãçµã¦å®å®ãã¦ãããã®ã¨æãã¾ãããããã¯ã·ã§ã³ã®ã³ã¼ãã«å ¥ããã®ã¯ããããããããã¾ãããããå®é¨æ®µéãªã使ãã®é¿ããããã¨ãæããããã²è©¦ãã¦ãã£ã¼ãããã¯ããã ããã°ã¨æãã¾ãã
(æ責ï¼mame)
Ruby 3ã®ãã¼ã¯ã¼ãå¼æ°åé¢ã«åããè¦å
- Automatic conversion of keyword arguments and positional arguments is deprecated, and conversion will be removed in Ruby 3. [Feature #14183]
Ruby 3ã§ã¯ãããã¼ã¯ã¼ãå¼æ°åé¢ãã¨ããéäºæãäºå®ããã¦ãã¾ããRuby 2.7ã§ã¯ãRuby 3ããåããªããªãã³ã¼ããè¦åããããã«ãªãã¾ããã
Ruby 2ã®ãã¼ã¯ã¼ãå¼æ°ã®å罪
Ruby 2ã®ãã¼ã¯ã¼ãå¼æ°ã¯ããã ã®ããã·ã¥ã®å¼æ°ã¨ãã¦æ¸¡ããã¾ããããã¯Ruby 1æ代ã®æ £ç¿ãå¼ãç¶ãã ãã®ã§ãå½æã¨ãã¦ã¯èªç¶ãªæ¡å¼µã ã£ãã¨æãã¾ãããããããã®è¨è¨ã¯æ°å¤ãã®éç´æçæåãçãç½ ã§ããã
ãªã«ãåé¡ãã¨è¨ãã¨ãå¼ã³åºãããã¡ã½ããå´ããã¯ãã¼ã¯ã¼ãã ã£ãã®ãããã·ã¥ã ã£ãã®ãåºå¥ã§ããªããã¨ã§ããå ·ä½ä¾ã§ç¤ºãã¾ãã
def foo(x, **kwargs) p [x, kwargs] end def bar(x=1, **kwargs) p [x, kwargs] end
ã¨ããããã£ãããªã¡ã½ããã2ã¤å®ç¾©ãã¾ãããããã«ããã·ã¥ã渡ãã¦å¼ã³åºãã¾ãã
foo({}) => [{}, {}]
bar({}) => [1, {}]
æåãéã£ã¦ããã¯ãªãã¾ããããã¡ã½ããå´ããã¯ãæå¾ã®å¼æ°ãããã·ã¥ãªãã¸ã§ã¯ãã ã£ãã®ããã¼ã¯ã¼ãã ã£ããããããªãã®ã§ããå¿ é å¼æ°ï¼ãã¼ã¯ã¼ãå¼æ°ï¼ãªãã·ã§ã³å¼æ°ãã¨ããå¾®å¦ãªåªå 度ã§è§£éããã¾ãã2.0ãªãªã¼ã¹å½åã¯ããã¼ã¯ã¼ãå¼æ°ï¼å¿ é å¼æ°ï¼ãªãã·ã§ã³å¼æ°ãã§ãããããã°å ±åãæ¥ãã®ã§å¾®å¦ã«å¤æ´ããã¾ããã
bar
ã«ãªãã·ã§ã³å¼æ°ã¨ãã¦{}
ã渡ãã«ã¯ã©ãããã°ããã§ãããããbar({}, **{})
ã¨ããã®ãæãã¤ãããããã¾ãããããããRuby 2.6ã§ã¯ããã¯æå¾
ã«åããçµæã¨ãªãã¾ãã
bar({}, **{}) => [1, {}]
**{}
ã¯ãä½ãæå®ããªãã®ã¨åããã¨ã¿ãªããã1ã¤ãã®{}
ããã¼ã¯ã¼ãã¨ãã¦è§£éããã¦ãã¾ãããã§ããbar
ã«å¼æ°{}
ã渡ãã«ã¯ãbar({}, {})
ã¨å¼ã¶ã®ãæ£è§£ã§ããããããªã®ãããããç¡ãã§ããã
ãªããå½åã®2.0ã§ã¯ã**{}
ã¯ä¸è²«ãã¦{}
ã渡ããã¨ããæå³ã§ããããã**{}
ã¯ç¡ã¨åãã§ããã¹ããã¨ãããã°å ±åãæ¥ãã®ã§å¾ããå¤æ´ããã¾ãããä½ããç´ãã¨æ°ããªéç´æãçã¾ãããã¨ããã®ãRuby 2ã®ãã¼ã¯ã¼ãå¼æ°ã¯ç¹°ãè¿ãç¶ãã¦ãã¾ãã
Ruby 3ã§ã®ãã¼ã¯ã¼ãå¼æ°
Ruby 2ã®åé¡ã¯ããã¼ã¯ã¼ãå¼æ°ãåãªãããã·ã¥ã¨ãã¦æ¸¡ãã¨ããåºæ¬è¨è¨ã«èµ·å ãã¦ãã¾ããRuby 3ã§ã¯ãããæ ¹æ¬çã«ç´ãã¾ããã¤ã¾ãããã¼ã¯ã¼ãå¼æ°ã¨ãã ã®å¼æ°ãåé¢ãã¾ãã
Ruby 3ã§ã¯ãfoo({})
ã¯ä¸è²«ãã¦æ®éã®å¼æ°ã渡ãã¾ããfoo(**{})
ã¯ä¸è²«ãã¦ãã¼ã¯ã¼ãå¼æ°ã渡ãã¾ããå®ç§ã«ããããããã§ããã
# in Ruby 3 foo({}) #=> [{}, {}] bar({}) #=> [{}, {}] foo(**{}) #=> wrong number of arguments (given 0, expected 1) bar(**{}) #=> [1, {}]
ããããã®ããã«ããã¼ã¯ã¼ãå¼æ°ã渡ãã¤ããã§foo(opt)
ãªã©ã¨æ¸ãã¦ããã³ã¼ãã¯åããªããªã£ã¦ãã¾ãã¾ããããã¯foo(**opt)
ã¨æ¸ãç´ãå¿
è¦ãããã¾ãã
ããã§Ruby 2.7ã¯ãååã¨ãã¦Ruby 2.6ã¨åãããã«åãã¾ããããã®ããã«åããªããªãå¼ã³åºãããã£ããè¦åãåºãããã«ãªã£ã¦ãã¾ãã
def foo(**kw) end foo({}) #=> test.rb:4: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call # test.rb:1: warning: The called method `foo' is defined here
ãã®è¦åãåºããã**
ã足ããªã©ã®å¯¾å¿ãããªãã¨Ruby 3ã§ã¯åããªããã¨ãããã¨ã«ãªãã¾ãã
ãã¼ã¯ã¼ãå¼æ°åé¢ã«ã¤ãã¦ãã詳ããã¯
ããã ããªãç°¡åãªã®ã§ããããã¼ã¯ã¼ãå¼æ°åé¢ã®ç§»è¡ã®ããã®æ¸ãæãã¯ããã°ãã°ãã£ã¨é£ããã¨ããããã¾ãï¼ç¹ã«å§è²ããããã±ã¼ã¹ï¼ãRubyã®å ¬å¼ãµã¤ãã«ç§»è¡ã¬ã¤ããæ²è¼ãã¦ããã®ã§ãè¦ã¦ã¿ã¦ãã ããã
ãã¼ã¯ã¼ãå¼æ°åé¢ã®è£è©±
ããã¯æºæã§ãããRuby 2ã§ãã¼ã¯ã¼ãå¼æ°ãå®è£
ããã®ã¯ç§ï¼é è¤ï¼ã§ããè¨ã訳ããã¨ãå¤å°éåæã®ããã³ã¼ãã¼ã±ã¼ã¹ããããã¨ãããã£ã¦ããã®ã§ãããRuby 1ãããã£ãããã·ã¥ã®ãã¬ã¼ã¹ãçç¥ããé¢æ°å¼ã³åºãï¼foo(:a => 1, :b => 2)
ï¼ã®èªç¶ãªæ¡å¼µãªã®ã§ãäºææ§ãèæ
®ããã¨æªããªã妥åã§ããã¨æã£ã¦ã¾ããã
ãããã2.0ãªãªã¼ã¹å¾ã«å¤æ°ã®éç´æçæåãå ±åããããã®ãã³ã«ã©ãã©ãè¤éæªå¥åº¦ãå¢ãã¦ãã£ã¦ãã¾ãã¾ãããè¨èªè¨è¨ããã°å ±åãã¼ã¹ãã³ãã¥ããã£ãã¼ã¹ã§ã¢ãããã¯ã«é²ããã¨å¤±æããä¾ã
ãã®ãã¨ã¯ãã£ã¨å¾æãã¦ãã¦ãRuby 3ã§ç´ãããªãç´ãããã¨æã£ã¦ãã¾ãããã¯ãã¯ãããã§ãã«ã¿ã¤ã ã³ããã¿ã«ãªã£ãããã«ããã®ãã¨ãmatzã«è©±ããã¨ãããmatzãåãããã«æã£ã¦ããããã§ãRubyWorld Conference 2017ãRubyConf 2017ãªã©ã§å¤æ´ãããã¨ã宣è¨ããã¾ããã
2017å¹´ã®çµããé ããmatzãakrãko1ãèªåã®4人ã§ãåé¡ç¹ã®æ´çãRuby 3ã®è¨è¨ã移è¡ãã¹ã®ç«æ¡ã«åãçµãã§ãã¾ãããé è¤ã¯ãè¨è¨æ¡ãã§ããã試ä½ãã¦ãé¡æã¨ãã¦ã¯ãã¯ãããã®Railsã¢ããªãå®è¡ãã¦ã¿ã¦ãå½±é¿ã測ããã¨ããã®ãç¹°ãè¿ãã¾ããããã®çµæã¯ãã±ãã [Feature #14183] ã«ãæ®ã£ã¦ãã¾ãã
å½åã¯å®å
¨ãªåé¢ãç®æãã¦ãã¾ãããããã¾ãã«ãéäºæã大ããï¼def foo(opt = {}); end
ã¨ããã¡ã½ããã«foo(k: 1)
ã渡ãã³ã¼ãã¯ãã¾ãã«ãå¤ãï¼ã¨ãããã¨ããã±ããä¸ã§Jeremy Evansã¨ãã人ã主張ãããã®ã±ã¼ã¹ã ãã¯åé¢ã諦ãããã¨ã§ãã±ããä¸ã§åæãã¾ãããããã2019å¹´4æããã
Jeremy Evansã¯ãã®è°è«ãå®é¨ããã£ããã«ã³ããã¿ã«ãªãã¾ãããå½¼ã¯åã«ä¸»å¼µããã ãã§ã¯ãªããé常ã«ç²¾åçã«å®è£ ãå®é¨ããã£ã¦ããã¾ãããå¾åã®å®è£ ã®å¤ãã¯å½¼ã®æã«ããã¾ããæè¬ã
(mame)
Numbered parameters
Numbered parameters as default block parameters are introduced. [Feature #4475]
You can still define a local variable named
_1
and so on, and that is honored when present, but renders a warning.
Numbered parameters ã¨ããããããã¯ãã©ã¡ã¼ã¿ã®å®£è¨ãçç¥ã§ããæ©è½ãå°å ¥ããã¾ããã
ary = [1, 2, 10]
ã¨ããé
å ary
ã®ä¸èº«ãããããã16é²è¡¨è¨ããæååã«å¤æããå¦çã¯ãary.map{|e| e.to_s(16)}
ã¨æ¸ããã¨ãåºæ¥ã¾ãããã®ãããã¯ãã©ã¡ã¼ã¿ e
ã¨ããå¤æ°åã¯ãelementã¨ããæå³ã§ãååãèããã®ãé¢åãªã¨ãã«ãç§ãé©å½ã«é¸ã¶å¤æ°ã§ãããã ãæ´æ°ãªãã ãããinteger ã® |i|
ãæ¨ã¦ãããã§ããããããããnumber ã® |n|
ãããããããã¾ãããã©ãã«ãã¾ããããããã¼ããååä»ãã¯é¢åãããã
ãããååãã¤ããã®ã¯é¢åãããã®ã§ããç°¡åãªããã°ã©ã ï¼é åã®ä¸èº«ã16é²è¡¨è¨ã«å¤æããã®ã¯ãRuby ã§ã¯ã¨ã¦ãç°¡åãªããã°ã©ã ã§ãããï¼ã§ãã¤ãã¤ãèããã®ã¯ãããªã®ã§ãã
ããã§ãNumbered parameter ã¨ããæ°æ©è½ãå°å
¥ããã¾ããï¼Feature #4475: default variable name for parameter)ããããã¯ã®å¼æ°ãã_1
ã_2
ã¨ãã¦ãååãä»ããã«åç
§ã§ããã¨ããæ©è½ã§ããå
ã»ã©ã®16é²è¡¨è¨ã¸ã®å¤æã¯ãary.map{_1.to_s(16)}
ã¨æ¸ããã¨ãã§ãã¾ãã
ary.map{|e| e.to_s(16)} ary.map{_1.to_s(16)}
並ã¹ã¦ã¿ãã¨ã3æåã»ã©çç¥ã§ãã¦ããã®ããããã¾ããã¾ããæåæ°ããããæ¸ãæã«ååãèããæéãæ¸ãã®ããå¬ããã¨ãããã¨æãã¾ãã
Numbered parametersã®ç´°ãã話
æ¸ãã¦ã¿ãã¨ãããã¨æããã§ããã沢山 _1
ã_2
ã¨ä¸¦ãã§ããã¨ããããããããªããªãã¾ããæ¬å½ã«ã¡ãã£ã¨ããããã°ã©ã ã«ããç¨ããªãããã«æ³¨æããã¨ããã§ããããããã誰ã RuboCop ã®ãã©ã°ã¤ã³ãæ¸ãã¦ã¾ãããï¼ãã¾ããä»ã®äººã«é©åã«æå³ããããããã«ããªããã°ãªããªãæãã使ããªãæ¹ãããã§ããããããããããããã°ã©ã ã¯ãé©åãªå¤æ°åããã
ãããã¯ãå ¥ãåã«ãªã£ã¦ãã¦ããããã¥ããã®ã§ããããã¯ã®å ¥ãå㧠Numbered parameter ãå©ç¨ã§ããã®ã¯ãããä¸ã¤ã®ãããã¯ã®ã¿ã¨ãªã£ã¦ãã¾ããä¾ãã°ãæå ãããã¯ã®ä¸ã§ä½¿ãããã«ããã¨ããã§ãããããã使ã£ã¡ããã¨ãã¨ã©ã¼ã«ãªãã¾ãã
3.times do _1.times do p _1 end end #=> # t.rb:3: numbered parameter is already used in # t.rb:2: outer block here # p _1 # ^~~~~~~~
ã¨ã©ã¼ã¡ãã»ã¼ã¸ãããããããã§ããã
ãªãããããã¯ã§ç¬¬ä¸å¼æ°ãå©ç¨ããã¨ããiter{|e|}
ã¨ãiter{|e,|}
ã¨ãããããä¼¼ãäºã¤ã®è¡¨è¨ãå©ç¨ãããã¨ãã§ãã¾ãããããã¯å¼æ°ã®å®£è¨ã§ã® |e|
ã |e,|
ã®éããã¤ã¾ãã³ã³ããã¤ãã¦ãããããªããã§ããã¾ããããã¾ãæ°ã«ããªãã¦ããã¨æãããé¢åãªã®ã§ç´°ãã解説ã¯ãã¾ãããããããã¯ä¸ã«_1
ã1åããæ¸ãã¦ããªããã°ã|e|
ã®æå³ã«ãªãã¾ãã
_1
ã¯ããã¼ã«ã«å¤æ°ãã¡ã½ããåã«ä½¿ããæ®éã®å¤æ°ã§ããããä»å¾ã¯å©ç¨ããªãã»ããè¯ãã§ãããããã§ã«ããæ¸ããããã°ã©ã ãããå ´åã¯ãå¤æ´ããå§ããã¾ãã
ããããããã¯ã®å¤å´ã§ _1
ã¨ãããã¼ã«ã«å¤æ°ãããã°ãããã¯å¤å´ã®ã¹ã³ã¼ãã®å¤æ°ã¨ãã¦å©ç¨ãããæé»ã®ãããã¯å¼æ°ã«ã¯ãªãã¾ããããã ãã_1 = ...
ã¨ããå¼ã«å¯¾ãã¦è¦åãåºãããã«ãªã£ã¦ãã¾ãã
_1 = 0 #=> warning: `_1' is reserved for numbered parameter; consider another name [1].each { p _1 } # prints 0 instead of 1
Numbered parameters ã«ã¤ãã¦ã®è°è«
ãã®æ©è½èªä½ã¯ãçµæ§æããè°è«ããã¦ãã¾ããããã ããªããªã決ã¾ãã¾ããã§ããã主ã«ã表è¨ã¨æ©è½ã®åé¡ã§ãã
ä¾ãã°ãGroovy ã¨ããè¨èªã«ã¯ it
ã¨ãããä»åã® _1
ç¸å½ã®æ©è½ãããã¾ããããã ãRuby ã§ã¯ RSpec ãªã©ã§ãã§ã«å©ç¨ããã¦ããèå¥åã§ããã¾ãã第ä¸å¼æ°ã®ã¿ã§è¯ãã®ããã¨ããè°è«ãããã¾ãããå人çã«ã¯ãSchemeï¼SRFI 26) ã® <>
ãè¯ãã£ããã§ããã!=
ã«è¦ãããã¿ãããªæè¦ãããã¾ããã
ãã ããªããªã決ã¾ããªãã£ãã¨ããã@1
, @2
, ... ã¨ããã®ã§ãã£ããã¨ãããã¨ãã® Ruby éçºè
ä¼è°ï¼æ¯æ1åãã¾ã¤ãã¨ããã¨ä»æ§ãæ¤è¨ããä¼è°ã§ãï¼ã§ã¹ãã³ã¨æ±ºã¾ãã¾ããããªãããã®ã¨ã㯠@1
ã ãå©ç¨ããã¨ã㯠|e,|
ã¨åãæå³ã§ããã
ãã®å¾ã表è¨ã«ã¤ãã¦ããããããªè°è«ãããã¾ãããä¾ãã° Misc #15723: Reconsider numbered parameters - Ruby master - Ruby Issue Tracking System ã¨ãããã±ããã§ã¯ã129 åã®ã³ã¡ã³ããéã¾ã£ã¦ã¾ããã
ã¾ããé è¤ããããæ©æ¢°çã«ãããã¯å¼æ°ã @1
, ... ã«å¤æ´ãã¦è¡¨è¨ã確èªãã¦ã¿ããã¨ãã£ãå®é¨ããã¦ãã ããã¾ããï¼https://twitter.com/mametter/status/1159346003536838656ï¼ããããè¦ã¦ãã¾ã¤ãã¨ããã²ãããã¯ã@1
ã£ã¦ã¡ãã£ã¨ã¤ã³ã¹ã¿ã³ã¹å¤æ°ã£ã½ããããªãã¨è¨ã£ã¦ã¾ããã
ãããªãããªã§ã代ããã« _1
, _2
, ... ã¨ãã表è¨ã¨ãªãã¾ãããã¾ããå§åçã« |e,|
ã§ã¯ãªãã|e|
ã¨ãã¦å©ç¨ãããã¨ãå¤ãããã_1
ã ãã®å©ç¨ã§ã¯ã|e|
ã¨æ¸ãã¦ããã®ã¨åãæå³ã«ãªãã¾ããããããã決ã¾ãã¾ã§é·ãã£ãã
ãã®æ©è½ã£ã¦ãçµå±ãããã¯ãããã«ç°¡åã«æ¸ãããã¨ãã話ãªãã§ããããä¸è¨16é²è¡¨è¨ã¸ã®å¤æã§ã¯ãä¾ãã°16é²è¡¨è¨æååã¸å¤æãã Integer#to_s16
ãããã°ãary.map(&:to_s16)
ã¨æ¸ããã¨ãã§ãã¾ããã¿ããªå¤§å¥½ããªã¢ã¬ã§ããããããããªãã®ã§ ary.map{_1.to_s(16)}
ã¨æ¸ããã¨ããããããããã¯ãç°¡åã«æ¸ããã¼ãºã«å¿ããããããããªãããã¨ããçç±ã§å°å
¥ããã¾ãããä»ã®æ¡ã¨ãã¦ã¯ãå¼æ°16ã渡ããProc
ãçæããä»çµã¿ãæä¾ããã®ã¯ã©ãããã¨ãã£ãææ¡ãããã¾ãããä¾ãã° ary.map(&:to_s(16))
ã§ããããããªãµããªè²ã
ãªè¡¨è¨ã®ãªã¯ã¨ã¹ãããã¦ãããããããã ããã解決ããããªãã¨ãããã¨ã§ãä»åã® numbered parameter ï¼_1, ...
ï¼ãå°å
¥ããã¾ããã
ãã®è¾ºãé¢æ°åè¨èªã£ã½ãæ©è½ãRubyã§ä½¿ãããã®ä»çµã¿ãããã£ãããã¶ã¤ã³ãã¦ããã人ãããã°ãã¾ãéã£ãæ©è½ãå ¥ãããç¥ãã¾ããã
(ko1)
proc/lambda
ããããã¯ãªãã§å¼ã¶ã®ã¯éæ¨å¥¨/ç¦æ¢ã«ãªãã¾ãã
Proc.new
andKernel#proc
with no block in a method called with a block is warned now.Kernel#lambda
with no block in a method called with a block raises an exception.
proc{...}
ã¨ããã°ãProc
ãªãã¸ã§ã¯ããçæã§ãã¾ãããã¦ããããã¯ã渡ããªãã¨ã©ããªããç¥ã£ã¦ã¾ããï¼
def foo proc.call #=> 1 end foo{p 1}
å®ã¯ããããã¯ãæå®ããªãã¨ãproc
ãå¼ã³åºããã¡ã½ããã«ããã£ã¦ãããããã¯ããProc
ãªãã¸ã§ã¯ãã¨ãã¦è¿ãã¾ãã
ã§ããã®æ©è½ã¯ããããããããã¯æ¸¡ãå¼æ°ããªãã¨ãã®ãã¶ã¤ã³ã ã£ãã®ã§ããããã®æ©è½ã¯è¾ãã¾ããããã¨ããã®ãä»åã®å¤æ´ã«ãªãã¾ãã使ãã¨ãwarning: Capturing the given block using Kernel#proc is deprecated; use '&block' instead
ã¨ãããè¦åãåºã¾ãã
lambda
ã¯ä»¥åããè¦åãåºã¦ããã®ã§ãããä¾å¤ï¼ArgumentError
ï¼ãåºãããã«ãªãã¾ããã
ãããã¯ç¡ã proc/lambda
ã使ããªãæ¸ãæ¹
ä»å¾ã¯ããããã¯æ¸¡ãå¼æ°ãç¨ãã¦ã
def foo &b b.call #=> 1 end foo{p 1}
ãããªãµãã«æ¸ãç´ãã¦ãã ããã
ãªããããã¡ã½ããããå¼æ°ã§ Proc
ã渡ããããããã¯ãããã¯ã渡ãããé¸æã§ããã¡ã½ãããå®ç¾©ããã¨ãããããã¯ç¡ã proc
ãå©ç¨ããã¦ãã¾ããã
def foo(pr = proc) pr.call end foo(proc{p 1}) #=> 1 foo{p 2} #=> 2
ããããããã¯æ¸¡ãå¼æ°ã ãã§åç¾ãããã¨ã¯ã§ãã¾ããã
def foo pr = nil, &b pr = pr || b pr.call end
ãããªæãã§ã1è¡ä½åã«æ¡ä»¶æãä»ãããã¨ã§å¯¾å¿å¯è½ã§ããã¾ããèªã¿ã¥ããã®ã§ãã©ã¡ããåããã¨ãã API ã¯è¾ãã¦ããã®ãããã®ã§ã¯ãªãã§ããããã
ãããã¯ç¡ã proc/lambda
ç¦æ¢ã®èæ¯
ãã®ä¿®æ£ãè¡ããããã£ããã¯ãå®ã¯ã¾ã¤ãã¨ããã²ãããã®ææ¡ï¼å
¥ã£ã¦ãªãï¼ã§ããããã¯ãåãä»ããªãã¡ã½ããã def foo(&nil)
ã¨å®ç¾©ã§ããããã«ããã¨ã©ãã ããããã¨ãããã®ã§ããããã®ææ¡ã¯ãã¤ããã£ããééãã¦ãããã¯ã使ããªãã®ã«ãããã¯ã渡ãã¦ãã¾ããã¨ãããã¹ãåé¿ãããã¨ãç®çã¨ãã¦ãã¾ããï¼ééãã¦ãp{...}
ã¨ããæ¸ãããã¨ããã¾ãããï¼ï¼ããã ããããå
¥ããã¨ãããããã¯ãç¨ããªããã¹ã¦ã®ã¡ã½ããå®ç¾©ããã¤ã¾ã大é¨åã®ã¡ã½ããå®ç¾©ã« &nil
ãä»ãã¾ãããå¤åãªé¢¨ç¿ãå¢ãããã ã£ãã®ã§ãå
¨åã§å対ãã¾ããã
ãã®ä»£ããã«ãã¤ã³ã¿ããªã¿ãã¡ã½ããã§ã®ãããã¯ã®å©ç¨ããã§ãã¯ãããããã¯ãå©ç¨ããªãã¡ã½ããã«ãããã¯ã渡ãã¦ããããè¦åãããã¯ã¨ã©ã¼ã«ããã°è¯ãããã§ããã¡ãã£ã¨è©¦ãã¨ã2ã¤ããããã°ãè¦ã¤ãããã¨ãã§ãã¾ããï¼[Feature #15554]ï¼ããã ããã®ææ¡ã¯ããã¤ãåé¡ããã£ã¦ãå ¥ã£ã¦ãã¾ãããã¨ããã®ããå®éã®ããã°ã©ã ã§ãããã¤ãæå³çã«ãã¡ã½ããã§ã¯ä½¿ããªãã®ã«ãããã¯ã渡ããã¨ããããã°ã©ã ãçºè¦ãããããã§ããRuby 3 ã«æå¾ ã
ãã¦ãããã¡ã½ããããããã¯ã®å©ç¨ã®å¯å¦ãå¤æããããã«ãããã¤ãé害ãããã¾ããããã®ä¸ã¤ãä»åã®ãããã¯ç¡ã proc
ã§ããproc
ã¯ãããã¯ãç¨ãã¾ãããã¤ã³ã¿ããªã¿ããã¯ããã ã®ã¡ã½ããã«è¦ãã¾ããproc
ã¨ããååã®ã¡ã½ããå¼ã³åºãããæ¬å½ã« Kernel#proc
ãªã®ããã³ã³ãã¤ã«æã«å¤æããæ¹æ³ã¯ Ruby ã«ã¯ãªãã®ã§ããã¡ãã¨ããããªãã®ã§ãã
ãã¦ãããããèæ¯ããããã¨ããããåã
ãããããã®ã§ã¯ãã¨è¨ããã¦ãããããã¯ãªã proc
ï¼ã¨ lambda
ï¼ã¯ obsolete ã¨ãªã£ãã®ã§ããã
(ko1)
beginless range
- A beginless range is experimentally introduced. It might not be as useful as an endless range, but would be good for DSL purpose. [Feature #14799]
Ruby 2.6ã§endless rangeãå ¥ã£ãã®ã§ã次ã¯beginless rangeãå ¥ãã¾ããã
ary = [1, 2, 3, 4, 5] p ary[..2] #=> [1, 2, 3]
endless rangeã¨éããbeginless rangeã¯#each
ãã§ããªãã®ã§ãå¤ã®ç¯å²ã表ç¾ããããã®ç¨éã«éãããã§ãããã
Companies.where(sales: ..100) 1.clamp(0..) case age when (...18) "æªæå¹´" when (18...) "æ人" end
(mame)
ç¹æ®å¤æ°$;
ã¨$,
ã®å»æ¢
- Setting
$;
to non-nil value is warned now. Use of it in String#split is warned too. [Feature #14240] - Setting
$,
to non-nil value is warned now. Use of it in Array#join is warned too. [Feature #14240]
Perlããå¼ãç¶ãã ç¹æ®å¤æ°ãå»æ¢ããåãã®ä¸ç°ã§ã$;
ã¨$,
ã®ä½¿ç¨ãè¦åãããããã«ãªãã¾ãããã©ãããå¤æ°ã ã£ãã調ã¹ãã®ãé¢åã§ãããString#split
ãArray#join
ã«é¢ä¿ããããã®ã ã£ãã®ã ã¨æãã¾ãã
ãã®ããã«ãããããç¥ããã¦ããªãã使ããã¦ãããªããã¨ã«å ããString#split
ãªã©ã®æåãã°ãã¼ãã«ã«å¤æ´ãããããã©ã¤ãã©ãªãæ³å®å¤ã®åããããå¯è½æ§ãããå±éºã§ãããã¨ããã®ãå»æ¢ã®çç±ã§ãã
(mame)
å¼ç¨ãã¢ããã¥ã¡ã³ãã®èå¥åã¯æ¹è¡ç¦æ¢
- Quoted here-document identifier must end within the same line.
ãã¢ããã¥ã¡ã³ãã§ãèå¥åãã¯ãªã¼ãã§å²ããã¨ãã§ãã¾ããã¡ãªã¿ã«ã<<'EOS'
ã®ããã«æ¸ãã¨ãæååã®åãè¾¼ã¿ãç¦æ¢ãããã¨ãã§ãã¾ãããã¦ããã® EOS
ã«ãããé¨åã¯ãå®ã¯æ¹è¡ãå«ããã¨ã許ããã¦ãã¾ãããã¡ãã£ã¨ä½ãè¨ã£ã¦ãããããããªãã¨æãã¾ããã
<<"EOS " # This had been warned since 2.4; Now it raises a SyntaxError EOS
ããããã³ã¼ããæ¸ããããã§ãããã®å ´åã¯ãEOS\n
ãåºåãæåã«ãªãã¾ãããRuby 2.4 ããããã®ãããªããã°ã©ã ã¯è¦åãåºã¦ãã¾ããããRuby 2.7 ã§ã¯ã¨ã©ã¼ã«ãããã¨ããå¤æ´ã«ãªãã¾ããå©ç¨ä¾ã¨ããã£ãã®ããªãã
(ko1)
flip-flop ãæ»ã£ã¦ãã
- The flip-flop syntax deprecation is reverted. [Feature #5400]
Ruby 2.6 㧠flip-flop 㯠obsolete ã¨ãªãã¾ãããããã¾ã 使ã£ã¦ããï¼ãã¨ãã声ãæ ¹å¼·ãã£ãã®ã§ï¼å¤åï¼ãæ»ã£ã¦ãã¾ããï¼obsolete ã§ã¯ãªããªãã¾ããï¼ããã¡ã³ã®æ¹ãããã§ã¨ããããã¾ãã声ã¯ããã¦ã¿ããã®ã§ããã
(ko1)
.bar
ã®ãããªã¡ã½ãããã§ã¤ã³ãä¸é¨ã³ã¡ã³ãã¢ã¦ãå¯è½ã«
- Comment lines can be placed between fluent dot now.
foo # .bar .baz # => foo.baz
ãããªãµãã«ãã¡ã½ãããã§ã¤ã³ foo.bar.baz
ãã.
ã®åã«æ¹è¡ãæãã§è¨è¿°ãã¦ããã¨ãã.bar
ã®é¨åã ãã³ã¡ã³ãã¢ã¦ãããããã¨ãããã¨ãã試è¡é¯èª¤ãã¦ããã¨ãã¨ãããããã§ãã以åã¯ãããã ãã³ã¡ã³ãã¢ã¦ãããã¨ææ³ã¨ã©ã¼ã¨ãªã£ã¦ãã¾ããããRuby 2.7 ã§ã¯ foo.baz
ã®æå³ã«ãªãããã«ãªãã¾ããã
ã¡ãªã¿ã«ãã³ã¡ã³ãè¡ã§ã¯ãªãã空è¡ã ã¨ææ³ã¨ã©ã¼ã§ãã
foo
.bar
#=> syntax error, unexpected '.', expecting end-of-input
(ko1)
self.
ãä»ãã¦ããã©ã¤ãã¼ãã¡ã½ãããå¼ã¹ãããã«ãªã£ã
- Calling a private method with a literal
self
as the receiver is now allowed. [Feature #11297] [Feature #16123]
ãã©ã¤ãã¼ãã¡ã½ããã¯ã¬ã·ã¼ããä»ãã¦å¼ã³åºããã¨ãã§ãã¾ããã§ãããããªãã¡ããã©ã¤ãã¼ãã¡ã½ãã foo
ãã recv.foo
ã®ããã«å¼ã¶ãã¨ã¯ã§ãã¾ããã§ãããself.foo
ãåæ§ã«é§ç®ã§ããããã ãããã¤ãã®çç±ãããself.
ãããã¤ããããã¨ããç¨éããã£ã¦ãRuby 2.7 ã§ã¯ããã許ãããããã«ãªãã¾ããã
self.p 1 #=> # Ruby 2.6: t.rb:1:in `<main>': private method `p' called for main:Object (NoMethodError) # Ruby 2.7: 1
ãªããæ£ç¢ºã« self.
ã¨ã¬ã·ã¼ããæ¸ããªããã°ãªãããs = self
ã®ãããªå¤æ°ã使ã£ã¦ s.foo
ã¨ãã¦ããã©ã¤ãã¼ãã¡ã½ããã¯å¼ã¹ã¾ããã
ãã®æ©è½ã«ãããä»ã¾ã§ self.private_method
ã¨å¼ã¶ã¨ãmethod_missing
ãå¼ã°ãã¦ããã®ããç´ ç´ã«å¼ã¹ãããã«ãªã£ãã®ã§ method_missing
ãå¼ã°ããªããªãã¨ãããè¥å¹²ã®éäºæãå
¥ãã¾ãããããã«ä¾åããããã°ã©ã ãããã¨ã¯æããããªã...ã
(ko1)
å¤é代å
¥ã«ãããå¾ç½® rescue
ã®åªå
度ã®å¤æ´
- Modifier rescue now operates the same for multiple assignment as single assignment. [Bug #8279]
a, b = raise rescue [1, 2] # Previously parsed as: (a, b = raise) rescue [1, 2] # Now parsed as: a, b = (raise rescue [1, 2])
ã³ã¡ã³ãã«ããéããªãã§ãããå¾ç½® rescue
ããå¤é代å
¥å¼ã§ä½¿ãããã¨ããã©ã®é¨åã«ããããå¤ããã¾ãããå¤æ´å¾ã®æ¬å¼§ã®ä½ç½®ã¯ãæ³å®ã¨åãã§ããï¼
ç§ãå¾ç½®rescue
ã¯é£ããã¦ä½¿ããªããã§ãããããã©ã®ä¾å¤ããã£ãããããã ã£ããã¨ãããããããªããªã£ã¡ãã£ã¦ã
(ko1)
ã·ã³ã°ã«ãã³ã¯ã©ã¹ã®ä¸ã§ yield
ã¯å»æ¢äºå®
yield
in singleton class syntax is warned and will be deprecated later [Feature #15575].
ä½ãè¨ã£ã¦ããã®ãããããªãã ããããããã£ã¦ãããªãã§ãã㧠yield
ãããããã¨ããæãã§ããã次ã®ãããªã³ã¼ã㯠Ruby 2.6 以åã§åãã¾ãã
def foo class << Object.new yield end end foo { p :ok } #=> warning: `yield' in class syntax will not be supported from Ruby 3.0.
ããããããããªãã®ã§ããã¾ããããã¨è¦åãåºã¾ãããããªãããï¼ããããªã®ãRuby 3 ã§ã¯ææ³ã¨ã©ã¼ã«ãªãäºå®ã§ãã
å¤æ´ã®èæ¯ã¯ãå®ã¯ãããã¯ç¡ã proc
ç¦æ¢ã¨åãã§ãã
(ko1)
å¼æ°ã転éããè¨æ³ (...)
- Argument forwarding by
(...)
is introduced. [Feature #16253]
åãåã£ãå¼æ°ããã®ã¾ã¾ä»ã®ã¡ã½ããã«è»¢éããããã®è¨æ³ãå°å ¥ããã¾ããã
def foo(...) bar(...) end
åãåãæ¹ã渡ãæ¹ã両æ¹ã¨ã(...)
ã§ãªãã¨æ§æã¨ã©ã¼ã«ãªãã¾ãã
å¾æ¥ã¯æ¬¡ã®ããã«æ¸ãã¦ããã¨æãã¾ããããã¯ç
©ããããã¨ã«å ããæé©åããã«ããã£ãããRuby 3ã§ã¯ããã«**opt
ãåã渡ããªãã¨ãããªããªã£ããããã¨ãããã¨ã§ãå°å
¥ããã¾ããã
# Ruby 2 def foo(*args, &blk) bar(*args, &blk) end # Ruby 3 def foo(*args, **opt, &blk) bar(*args, **opt, &blk) end # (...)ã使ã£ãå ´åï¼Ruby 2.7ã¨Ruby 3以éã®ä¸¡æ¹ã§åãï¼ def foo(...) bar(...) end
ãªãããRubyã®ã¡ã½ããå¼ã³åºãã¯ã«ãã³ãçç¥ã§ãããã¨è¦ãã¦ãã人ãå¤ãã¨æãã¾ããããã®è¨æ³ã¯ã«ãã³ãå¿
é ã§ãããªããã¨ããã¨ãbar ...
ã¯endless rangeã¨è§£éããã¦ãã¾ãããã§ãã
2020-02-21ç·¨éï¼ãå¼æ°ãå§è²ããè¨æ³ãã¨å¼ãã§ãã¾ãããããå¼æ°ã転éããè¨æ³ãã«å¤ãã¾ããã
(mame)
$SAFE
ã®å»æ¢
- Access and setting of
$SAFE
is now always warned.$SAFE
will become a normal global variable in Ruby 3.0. [Feature #16131]
Ruby ããã¤å¤ã®ã»ãã¥ãªãã£æ©æ§ã§ãã $SAFE
ãå»æ¢ããã¾ãããããããã$SAFE
ã£ã¦ç¥ã£ã¦ã¾ããï¼
$SAFE
ã¯ãåºæ¬çã«ã¯ä¿¡é ¼ã§ããªããã¼ã¿ï¼æååãªã©ï¼ã«ãã©ã°ãä»ãã¦ããã¦ï¼taint
ãã©ã°ï¼ãsystem
ã open
ã¨ãã£ããå±ãªãæä½ã£ã½ããã®ããããã¨ããããã¤ã³ã¿ããªã¿ããå±ãªãããããã¦ï¼ãã¨æ¢ãã¦ãããï¼SecurityError
ãåºã¾ãï¼ã¨ããæ©è½ã§ãã
ãã ãç¾ä»£ã®ãã¬ã¼ã ã¯ã¼ã¯ã§ã¯ã$SAFE
ã«ã¤ãã¦èæ
®ãããé©å㪠taint
ãã©ã°ã®ä»ä¸ãè¡ãããªããªã©ã$SAFE
ãå®è³ªçã«å©ç¨å¯è½ã§ã¯ãªããªã£ã¦ãã¾ããããã®ãããªä¸å®å
¨ãªç¶æ³ã§ã$SAFE
ãééã£ã¦ä¿¡é ¼ãã¦ãã¾ãã¨ã»ãã¥ãªãã£ä¸åé¡ãªã®ã§ããã£ãæ¶ãã¦ãã¾ãããã¨ããã®ãä»åã®ææ¡ã§ãã
$SAFE
ã«ä½ã代å
¥ãã¦ããä¸è¨ã®ãããªè¦åãåºã¾ãã
$SAFE = 1 #=> t.rb:1: warning: $SAFE will become a normal global variable in Ruby 3.0
Ruby 3.0 ã§ã¯ã$SAFE
ã¯ãã ã®ã°ãã¼ãã«å¤æ°ã«æ»ãã¨ã®ãã¨ã§ããã¦ã£ãããæ°¸ä¹
æ¬ çªã¿ãããªæ±ãã«ããã®ãã¨æã£ã¦ã¾ããã
Object#{taint,untaint,trust,untrust}
and related functions in the C-API no longer have an effect (all objects are always considered untainted), and are now warned in verbose mode. This warning will be disabled even in non-verbose mode in Ruby 3.0, and the methods and C functions will be removed in Ruby 3.2. [Feature #16131]
ãã®å¤æ´ã«ä¼´ããObject#taint
ãªã©ã®ã¡ã½ããã¯ãä½ãå¹æããªããªãã¾ããã¤ã¾ããtaint
ãã©ã°ã®ã¤ãããªãã¸ã§ã¯ãã¯åå¨ããªãã¨è¨ããã¨ã§ããRuby 3.2 ã§ãããã®ã¡ã½ããã¯åé¤ããããããªã®ã§ãæ©ãã«å¯¾å¦ãã¾ãããã
(ko1)
Object#method
ãªã©ã§Refinementsãèæ
®ããããã«ãªã£ã
- Refinements take place at Object#method and Module#instance_method. [Feature #15373]
ä»ã¾ã§ãObject#method
ãªã©ã§åãåºãã¡ã½ããã¯ãRefinementsãæ°ã«ãã¦ãã¾ããã§ããããã¡ããã¨æ°ã«ããããã«ãªãã¾ããã
# [[Feature #15373]](https://bugs.ruby-lang.org/issues/15373) ããä¸é¨å¤æ´ãã¦å¼ç¨ # default call to #pp module P2PP refine Kernel do def p obj pp obj end end end using P2PP method(:p).call ['1' * 40, '2' * 40] #=> # Ruby 2.6: ãªãªã¸ãã«ã® p ãå¼ã°ãã # ["1111111111111111111111111111111111111111", "2222222222222222222222222222222222222222"] # Ruby 2.7: Refinements (using) ãå¹ã㦠pp ã«ãªã # ["1111111111111111111111111111111111111111", # "2222222222222222222222222222222222222222"]
(ko1)
çµè¾¼ã¯ã©ã¹ã®ã¢ãããã¼ã
Array#intersection
ã®å°å
¥
- Added Array#intersection. [Feature #16155]
é
åã®å
±éã®è¦ç´ ã ããåãåºãArray#intersection
ãå°å
¥ããã¾ããããã¨ãã¨ãã£ãArray#&
ã¨å¤§ä½åãã§ãï¼3ã¤ä»¥ä¸ã®é
åã®intersectionãåããã¨ãããã¡ãã£ã¨éãï¼ã
ary1 = [1, 2, 3, 4, 5] ary2 = [1, 3, 5, 7, 9] p ary1.intersection(ary2) #=> [1, 3, 5]
Ruby 2.6ã§Array#|
ã«å¯¾å¿ãããã®ã¨ãã¦Array#union
ãå°å
¥ããã¾ããããintersection
ã¯è¦æããªãã£ãããè¦éããã¦ãã¾ãããããä»åè¦æãæ¥ãã®ã§å
¥ãã¾ãããRubyã®éçºã¯ãã¾ã«åå·çãªã»ã©è¦æãã¼ã¹ã§åãã¾ãã
(mame)
Array#minmax
, Range#minmax
ã®æ§è½åä¸
- Added Array#minmax, with a faster implementation than
Enumerable#minmax
. [Bug #15929]
ary.minmax
ãå®è¡ããã¨ãEnumerable#minmax
ãå®è¡ããã¾ããããArray#minmax
ãå¥éç¨æãããã¨ã§ãããé«éã«å®è¡ãããã¨ãã§ããããã«ãªãã¾ããã#each
ã使ããªãããã§ããã
Enumerable
+ each
ã§è¯ãæãã«å
¨é¨å®ç¾©ã§ãããã¨ããã®ã¯ãããããããã©ãç¾å®çã«ã¯ããããå¤æ´ãå
¥ãã¾ããè¨èªå¦çç³»éçºè
ã¨ãã¦ã¯ãæ¬å½ã¯ããããªãã¦ãéãã§ããã¨ãããã§ããã©ãã
- Added
Range#minmax
, with a faster implementation thanEnumerable#minmax
. It returns a maximum that now corresponds toRange#max
. [Bug #15807]
åãããã«ãRange#minmax
ãå¥éç¨æããã¾ããããªããæ大å¤ãç®åºããã¢ã«ã´ãªãºã ããEnumerable#max
ã§ã¯ãªããRange#max
ãç¨ãããããããããããéäºæãåºãããç¥ãã¾ããã
(ko1)
Comparable#clamp
ãRangeå¼æ°ã«å¯¾å¿
- Comparable#clamp now accepts a Range argument. [Feature #14784]
-1.clamp(0..2) #=> 0 1.clamp(0..2) #=> 1 3.clamp(0..2) #=> 2
è¦ã¦ã®éãã0..2
ã®ç¯å²ã«åã¾ãããã«åãä¸ãã»åãä¸ããããã¾ããn.clamp(0, 2)
ã§åããã¨ã¯ã§ãã¦ããã®ã§ãããã©ããã¦ãRangeã§æ¸ãããã¨ãã声ãããã対å¿ãã¾ããããªãexclusive rangeãä¸ããã¨ä¾å¤ã«ãªãã¾ãï¼è¶
ããã¨ãã®åãä¸ãã®æå³ãå®ç¾©ã§ããªãã®ã§ï¼ã
0.clamp(0...2) #=> ArgumentError (cannot clamp with an exclusive range)
(mame)
Complex#<=>
ã®å°å
¥
- Added
Complex#<=>
. So0 <=> 0i
will not raiseNoMethodError
. [Bug #15857]
æ¯è¼ãå®ç¾©ã§ããªããã¨ã§æåãªComplexã«æ¯è¼ã¡ã½ãããå°å ¥ããã¾ããã
Complex(1, 0) <=> 3 #=> -1
ã®ããã«ãèæ°é¨ã0ã®ã¨ãã¯æ¯è¼ã§ãã¦ã»ãããã¨ããããã®ãã®ã®ããã§ãããªãèæ°é¨ã0ã§ãªãComplexã®æ¯è¼ã¯nil
ã«ãªãã¾ããã
Complex(0, 1) <=> 1 #=> nil
(mame)
Dir.glob
ãDir.[]
ãNULã»ãã¬ã¼ããã¿ã¼ã³é対å¿ã«
Dir.glob
andDir.[]
no longer allow NUL-separated glob pattern. Use Array instead. [Feature #14643]
誰ãç¥ããªãããªæ©è½ãã²ã£ããã¨æ¶ãã¾ããããã¨ãã°ãã¡ã¤ã«fooã¨barããããã£ã¬ã¯ããªã§"f*\0b*"
ã¨ãããã¿ã¼ã³ãDir.globããã¨
Dir.glob("f*\0b*") #=> ["foo", "bar"]
ã¨ããããã«ããã¿ã¼ã³ã®ORãæ¸ããã¨ãã§ãã¾ãããããå»æ¢ããã¾ãããåããã¨ããããããã°é åã使ãã¾ãã
Dir.glob(["f*", "b*"]) #=> ["foo", "bar"]
(mame)
CESU-8 ã¨ããã¨ã³ã³ã¼ãã£ã³ã°ã®è¿½å
- Added new encoding CESU-8 [Feature #15931]
CESU-8 ã¨ããã¨ã³ã³ã¼ãã£ã³ã°ã追å ããã¾ããã
ããç¥ããªãã®ã§ãããéæ¨å¥¨ã®ã¨ã³ã³ã¼ãã£ã³ã°ã ãããªã®ã§ï¼UTR #26: Compatibility Encoding Scheme for UTF-16: 8-Bit (CESU-8)ï¼ãä»ã®ã·ã¹ãã ã使ã£ã¦ããã¨ããããããã®ããªããã°é¢ä¿ãªãã§ãããã
(ko1)
Enumerable#filter_map
ã®è¿½å
- Added Enumerable#filter_map. [Feature #15323]
filter
ã¨map
ãåæã«ããã¡ã½ããã追å ããã¾ããã
[1, 2, 3].filter_map {|x| x.odd? ? x.to_s : nil } #=> ["1", "3"]
ãããã¯ã§å¤æããçµæãå½ï¼false
ãnil
ï¼ã ã£ããæ¶ããã¾ãã両æ¹æ¨ã¦ãã¹ãããnil
ã ãæ¨ã¦ãã¹ããã¯ä¸é·ä¸çã§ã幾度ãè°è«ããã¾ããããã¾ã¤ãã¨ããã²ãããã®ç´æã«ãã£ã¦ä¸¡æ¹æ¨ã¦ããã¨ã«ã
ããããã次ã¨åãæå³ã§ããfilter
ãã¦map
ã
[1, 2, 3].filter {|x| x.odd? }.map {|x| x.to_s } #=> ["1", "3"]
次ã®ä¾ã¯map
ãã¦filter
ã®ããã«è¦ããªãããªãã§ãã
# é åã®å é è¦ç´ ãéããããã ãå½ã¯æ¨ã¦ã [ary1, ary2, ary3].filter_map {|ary| ary.first } [ary1, ary2, ary3].map {|ary| ary.first }.filter {|elem| elem }
filter
ã¨map
ã¯çµã¿åããã¦ä½¿ããããã¨ãå¤ãã®ã§ãä¸éé
åãä½ããªãã¦æ¸ãå°ç¨ã¡ã½ããã¨ãã¦å°å
¥ããã¾ãããã±ããªè©±ã§ãã
(mame)
Enumerable#tally
ã®è¿½å
- Added Enumerable#tally. [Feature #11076]
è¦ç´ ã®æ°ãæ°ãã便å©ã¡ã½ãããå°å ¥ããã¾ããã
["A", "B", "C", "B", "A"].tally #=> {"A"=>2, "B"=>2, "C"=>1}
è¦ç´ ããã¼ãåæ°ãå¤ã¨ããããã·ã¥ã«ãã¦è¿ãã¾ãã誰ãã1度ã¯èªåã§å®è£ ãããã¨ãããã®ã§ã¯ãªãã§ããããã
ã¡ãªã¿ã«tally
ã¨ã¯ãç·ãæ¸ããªããæ°ãæ°ããåä½ã表ãåèªã ããã§ãï¼Tally marks - Wikipediaï¼ãæ¥æ¬èªã ã¨ãæ£ãã®åãæ¸ãã¦ãããã¤ã
(mame)
Enumerator.produce
ã®è¿½å
- Added Enumerator.produce to generate Enumerator from any custom data-transformation. [Feature #14781]
Enumeratorã§ç¡éåãä½ãã®ã«ä¾¿å©ãªã¯ã©ã¹ã¡ã½ããã追å ããã¾ããã
naturals = Enumerator.produce(0) {|n| n + 1 } # [0, 1, 2, 3, ...] p naturals.take(10) #=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
å¼æ°ãåæå¤ã§ãããã«å¯¾ãã¦ç¹°ãè¿ããããã¯ã®å¤æãé©ç¨ãããã¨ã§ç¡éåãä½ãã¾ãã
è¦æã¯2.6ã®ãããããã£ããã®ã®ãååããªããªã決ã¾ããªãã£ãã¡ã½ããã§ãããHaskellã§ã¯iterate
ã¨ããååã§ãããRubyã§ã¯ã¤ãã¬ã¼ã¿ã¨ããè¨èããã£ã¦ç´ãããããgenerate
ã¯ã¡ãã£ã¨ä¸è¬çãããã®ã§ã¯ãªãããrecurrence
ã¯è¯ãããããªããfrom
ã¯ã©ããããªã©ã¨ããã¦ãçµå±ã¾ã¤ãã¨ããã²ãããã®å¥½ã¿ã§produce
ã«ã
(mame)
Enumerator::Lazy#eager
ã®è¿½å
- Added
Enumerator::Lazy#eager
that generates a non-lazy enumerator from a lazy enumerator. [Feature #15901]
Enumerator::Lazy
ããEnumerator
ã«å¤æããã¡ã½ããã§ãããããç解ããã«ã¯ãã¡ãã£ã¨é·ãèæ¯ãç解ããå¿
è¦ãããã¾ãã
Rubyã«ã¯è¦ç´ ã®åã表ãã£ã½ããã¼ã¿ãArray
ãEnumerator
ãEnumerator::Lazy
ã®3種é¡ããã¾ãã
Array
ã¯ããã¹ã¦ã®è¦ç´ ãã¡ã¢ãªä¸ã«ä¸¦ã¹ããã¼ã¿ã®ã¯ã©ã¹ã§ãè¦ç´ ã®æ°ã ãã¡ã¢ãªãæ¶è²»ããç¹æ§ãããã¾ãã
ä¸æ¹Enumerator
ã¨Enumerator::Lazy
ã¯ãã次ã®è¦ç´ ãyieldããè¨ç®ããå
é¨è¡¨ç¾ã¨ããã¯ã©ã¹ã§ãåãåã表ç¾ããã®ã§ãã¡ã¢ãªæ¶è²»ãåé¿ã§ãã¾ãããã®ä»£ãããé
ããã©ã³ãã ã¢ã¯ã»ã¹ã§ããªãããªã©ã®ãã¡ãªãããããããã¬ã¼ããªãã«ãªã£ã¦ãã¾ãã
Enumerator
ã¨Enumeartor::Lazy
ã®éãã¯ä½ã¨ããããããã®ã§ãããEnumerator
ã®ã¡ã½ãããå¼ã¶ã¨è¦ç´ ãåæãã¦Array
ã«ãã¦ãã¾ããã¨ãå¤ãã®ã«å¯¾ããEnumerator::Lazy
ã¯ã¡ã½ãããå¼ãã§ã#force
ã¡ã½ãããå¼ã¶ã¾ã§è¦ç´ ã®åæãé
延ããã¾ãã
ãã¨ãã°ã0ãã10,000ã¾ã§ã®åã«å¯¾ããåè¦ç´ ã2åããå é ã®5è¦ç´ ãåãåºãããã¨ãã¾ãã
# Enumeratorã®å ´å e = (0..10000).each # Enumerator p e.map {|n| n * 2 } #=> [0, 2, 4, 6, ...] (Array) # Enumerator::Lazyã®å ´å e = (0..10000).each.lazy p e.map {|n| n * 2 } #=> #<E::Lazy: #<...>:map> p e.map {|n| n * 2 }.take(5) #=> #<E::Lazy: #<...>:take> p e.map {|n| n * 2 }.take(5).force #=> [0, 2, 4, 6, 8] (Array)
Enumerator#map
ã¯ãããªãè¦ç´ ãåæãã¦Array
ãè¿ãã¦ãã¾ãã®ã§ãé·ã10,000ã®é
åãä½ã£ã¦ãã¾ããã¡ã¢ãªã大éã«æ¶è²»ãã¦ãã¾ãã¾ãã
ä¸æ¹Enumerator::Lazy#map
ã¯ãè¦ç´ ã®åæãå¾åãã«ãã¦ããã®ã§ãArray
ã§ã¯ãªãEnumerator::Lazy
ãè¿ãã¾ããããã«å¯¾ãã¦take(5)
ããã¦æå¾ã«force
ããããã¨ã§ãé·ã10,000ã®é
åãä½ããã«å
é 5è¦ç´ ãåãåºããã¨ãã§ãã¾ãã
ãã¦ãEnumerator
ãåãåã£ã¦ãæå¾ã«ç¾ããå¥æ°ãè¿ãlast_odd
ã¡ã½ãããèãã¾ãï¼ãã¾ãããä¾ã§ã¯ãªãã§ããï¼ã
def last_odd(e) e.select {|x| x.odd? }.last end
ãã®ã¡ã½ããã«Enumerator::Lazy
ã渡ãããã¨ããã©ãããã°ããã§ããããããã®ã¾ã¾æ¸¡ãã¨ãselect
ã®çµæãEnumerator::Lazy
ã¨ãªããããã«ã¯last
ãå®ç¾©ããã¦ããªãã®ã§ã¨ã©ã¼ã«ãªãã¾ããforce
ã§Array
ã«ãã¦ãã渡ãã°åãã¾ãããã¡ã¢ãªãç¡é§é£ããããã¨ã«ãªãã¾ããEnumerator::Lazy
ããEnumerator
ã«å¤æã§ããã°ããã®ã§ãããå®ã¯ç°¡åã«å¤æããAPIãããã¾ããã§ããã
ã¨ãããã¨ã§ãä»åå
¥ã£ãã®ãEnumerator::Lazy#eager
ã§ãã
e = (0..10000).each.lazy e = e.map {|n| n * 2 }.take(5).eager #=> [0, 2, 4, 6, 8] ç¸å½ã® Enumeratorï¼ãã®æç¹ã§ã¯ã¾ã ã¡ã¢ãªç¢ºä¿ããªãï¼ p e.map {|n| n + 1 } #=> [1, 3, 5, 7, 9] (Array)
ããã使ã£ã¦Enumerator
ã«ããã°ãç¡äºlast_odd
ã«Enumerator::Lazy
ã渡ãã¾ãã
e = (0..10000).each.lazy last_odd(e) #=> NoMethodError last_odd(e.force) #=> 9999 (åããã©éå¹ç) last_odd(e.eager) #=> 9999
ãããããããããã§ãããArray
ã¨Enumerator::Lazy
ã ããªãè¯ãã£ãã®ã«ãã¨ããæ°ããã¾ãã
(mame)
Enumerator::Yielder#to_proc
ã®è¿½å
- Added Enumerator::Yielder#to_proc so that a Yielder object can be directly passed to another method as a block argument. [Feature #15618]
Enumerator::Yielder
ãeach
ã«&
ã§æ¸¡ããããã«ãªãã¾ãããã¨ãã£ã¦ããã人ã¯ã»ã¨ãã©ããªãã¨æãã
Enumerator
ã¯ä½ãæ¹æ³ã2ã¤ããã¾ãã1ã¤ã¯ä¸ã§ç¤ºãã(0..10000).each
ã®ããã«ããããã¯ãçç¥ããeach
ãªã©ãå¼ã³åºãæ¹æ³ããã1ã¤ã¯Enumerator.new {|y| ... }
ã使ãæ¹æ³ã§ãã
e = Enumerator.new do |y| y << 1 y << 2 y << 3 end p e.to_a #=> [1, 2, 3]
ãã®y
ãEnumerator::Yielder
ã¯ã©ã¹ã®ãªãã¸ã§ã¯ãã§ããããã«to_proc
ã追å ãããã®ã§ã次ã®ãããªãã¨ãæ¸ãã¾ãã
e = Enumerator.new do |y| [1, 2, 3].each(&y) # 次ã¨åãæå³ # [1, 2, 3].each {|x| y << x } end p e.to_a #=> [1, 2, 3]
Enumerator
ã£ã¦ã©ã®ãããã®äººã使ãããªãã¦ãã®ããæ°ã«ãªãã¾ãã
(mame)
Fiber#raise
ã®è¿½å
- Added
Fiber#raise
that behaves likeFiber#resume
but raises an exception on the resumed fiber. [Feature #10344]
Fiber#raise
ã¨ããã¡ã½ããã追å ããã¾ãããä½ããããã¨ããã¨ãã¾ã resume
ãã¦ããã®å¾ãresume
å
ã®ã³ã³ããã¹ãã§ãä¾å¤ãçºçããã¾ãã
f = Fiber.new do Fiber.yield #=> Fiber#raise ã«ãã£ã¦ãããã§ä¾å¤ãçºçãã rescue Exception p $! end f.resume f.raise
Fiber ã worker ã¿ãããªãã¨ããã¦ããã¨ããå¦çãä¸æããããããªä¾å¤ãåºããããªç¨éãèãããã¾ãã
worker = Fiber.new do loop do task = Fiber.yield do_task(task) end end worker.resume # kick worker.resume 1 worker.resume 2 worker.raise StopIteration # loop ããæãã
ãããªããé£ããã®ã§ï¼Fiber ä½æè
ã®æå³ããªãä¾å¤ããã¼ãçæããå¯è½æ§ãçãã¾ãï¼ãã§ããã°å©ç¨ãé¿ããæ¹ãããã¨æããªããresume
ã§æ示çã«å¦çãããã°ããããã«æãã¾ãã
ä¾ãã°ããã£ãã®ä¾ã ã¨ã
worker = Fiber.new do while task = Fiber.yield do_task(task) end end worker.resume # kick worker.resume 1 worker.resume 2 worker.resume nil
nil
ãæ¥ããçµãããã¨æ¸ãã°æ¸ã¿ã¾ãã
(ko1)
File.extname
ã®ã³ã¼ãã¼ã±ã¼ã¹ãå¤æ´
- File.extname now returns a dot string at a name ending with a dot on non-Windows platforms. [Bug #15267]
ãã¡ã¤ã«åæååããæ¡å¼µåãå¾ãFile.extname
ãå¾®å¦ã«å¤åãã¾ããã
File.extname("foo.") #=> "" in Ruby 2.6 #=> "." in Ruby 2.7
ãªããã¨ããã¨ãbasenameã®çµæã¨extnameã®çµæãçµåããã¨ãã«å ã«æ»ãããã«ããããã§ãã
f = "foo." b = File.basename(f, ".*") #=> "foo" e = File.extname(f) #=> "." p b + e == f #=> true
ãªããæ·±é ãªçç±ã«ããWindowsã§ã¯ããã¯""
ã®ã¾ã¾ã«ãªãã¾ãããããããããªãã§ããWindowsã§ã¯æå¾ããããã§çµãããã¡ã¤ã«åã¯ç¡å¹ã ããã ããã§ãã
(mame)
FrozenError
ã receiver
ããµãã¼ã
- Added
FrozenError#receiver
to return the frozen object that modification was attempted on. To set this object when raisingFrozenError
in Ruby code, pass it as the second argument toFrozenError.new
. [Feature #15751]
freeze ããããªãã¸ã§ã¯ãã«å¯¾ãã¦æ´æ°ã試ã¿ãã¨ãFrozenError
ä¾å¤ã«ãªãã¾ããã©ã®ãªãã¸ã§ã¯ããæ´æ°ãããã¨ããããFrozenError#receiver
ã§ç¥ããã¨ãã§ããããã«ãªãã¾ããã
begin ''.freeze << 1 rescue FrozenError => e p e.receiver #=> ""ãã¤ã¾ã Frozen ãªæååã«å¯¾ãã¦å¤æ´ãããã¨ãããã¨ãããã end
ãªããFrozenError.new(receiver: obj)
ã¨ãã¦ãreceiver
ãæå®ã㦠FrozenError
ãä½ããããã«ãªãã¾ãããããã¾ãããããªã®ä½ãæ©ä¼ã¯æ»
å¤ã«ãªãã§ãããããã
ã¨ãæã£ã¦ rubygems ã§å
¬éããã¦ãã Gem ã®ã³ã¼ãã FrozenError.new
ã§æ¤ç´¢ãã¦ã¿ãã¨ã122 è¡ã¿ã¤ããã¾ãããæå¤ã¨ãããªã
(ko1)
GC.compact
ã®è¿½å
- Added
GC.compact
method for compacting the heap. This function compacts live objects in the heap so that fewer pages may be used, and the heap may be more CoW friendly. [Feature #15626]
Ruby 2.7 ã®ç®çã®ä¸ã¤ã¨ãè¨ããããã¼ãã®ã³ã³ãã¯ã·ã§ã³æ©è½ã§ããGC.compact
ã¨ããã¾ãããGC ã®ãã³ã«è¡ãããã§ã¯ãªããæå㧠GC.compact
ã¡ã½ãããå®è¡ãã度ã«ãã³ã³ãã¯ã·ã§ã³ãè¡ãã¾ãã
詳細ã¯å½è©²ãã±ãããè¦ã¦ä¸ããã
GC.compact
: ã³ã³ãã¯ã·ã§ã³ã¨ã¯ä½ã
ããã¼ãã®ã³ã³ãã¯ã·ã§ã³ãã¨ã¯ä½ããã¡ãã£ã¨ãç´¹ä»ãã¾ããã¾ããRuby ã®ãªãã¸ã§ã¯ãã¯ããã¼ãã«æ ¼ç´ããã¦ãã¾ããããã¦ããã¼ãã¯ãã¼ã¸ã®éåã¨ãã¦å®è£ ããã¦ãã¾ãããã¼ã¸ã¯ããªãã¸ã§ã¯ããæ ¼ç´ããã¹ãããã®ä¸¦ã³ã§ãã
ãã¦ããªãã¸ã§ã¯ããçæããã¨ãã空ãã¹ããããæ¢ãã¦ãã®ã¹ããããæ°ãããªãã¸ã§ã¯ãã¨ãã¦å©ç¨ãã¾ããGC ãçºçããã¨ã使ã£ã¦ããã¹ãããã¯ãã®ã¾ã¾ã«ã使ã£ã¦ããªããªãã¸ã§ã¯ãï¼ã®ã¹ãããï¼ãååãããã®ã¹ãããã空ãã¹ãããã¨ãã¦ç¢ºä¿ãã¾ããã¤ã¾ããGC å¾ã¯ã空ãã¹ãããã¨å©ç¨ä¸ã¹ããããããããã¾ã°ãã«åå¨ãããã¨ã«ãªãã¾ãã
MRI ã«ããããã¼ãã®ã³ã³ãã¯ã·ã§ã³ã¨ã¯ã空ãã¹ãããã®ãããã¼ã¸ã«ãçãã¦ãããªãã¸ã§ã¯ããå¥ã®ãã¼ã¸ããåããã¦è©°ãã¦ãããã¨ãããã®ã§ããçµæçã«ãã空ãããããã¼ã¸ãã沢山ãã£ãç¶æ ãããã空ãã®ãªããã¼ã¸ãã空ã ãã®ãã¼ã¸ãï¼ã¨ãããããã®ã空ãããããã¼ã¸ãï¼ã«ãããã¨ãã§ãã¾ãããã©ã°ã¡ã³ãã¼ã·ã§ã³ã®è§£æ¶ã¨ãããã¨ã§ããã空ãã ãã®ãã¼ã¸ã解æ¾ããã°ãã¡ã¢ãªå¹çããããªãã¾ãã
GC.compact
: ä»åå°å
¥ãããæ©è½
GCã¢ã«ã´ãªãºã ã®ä¸ã¤ã«ã³ãã¼GCã¨ããã®ãããã®ã§ãããã³ã³ãã¯ã·ã§ã³ãèªåçã«è¡ããããªã¢ã«ã´ãªãºã ã§ããåå¨ã¯ãã¡ããç¥ã£ã¦ãã¦ããªãã¨ããªããªãããªããã¨ã¯æã£ã¦ãã¾ããããã ããããããªçç±ï¼ä¸»ã«æ§è½çãªçç±ï¼ãããã³ãã¼GCã®ãããªãæ¯åã³ã³ãã¯ã·ã§ã³ãè¡ããã㪠GC ãå°å
¥ããã®ã¯é£ãããªãã¨æã£ã¦ãããã§ãããä»åå°å
¥ããã GC.compact
ã¯ã人éãæ示çã«æ示ãããã¨ããçºæ³ã®è»¢æã§ãè¦äºã«å®ç¾ããã¾ããã
ãªããæè¡çã«ã¯ãMRIã§ã¯ãããªãã¸ã§ã¯ããåãããã¨ãããã¨ãåºæ¥ãªããªãã¸ã§ã¯ããããã¤ãããã¾ãï¼æ´å²ççµç·¯ã§ãï¼ããã®ããããããã¯ãã®ã¾ã¾æ®ãã¦ãåããã奴ã ãåãããã¨ããã¢ã«ã´ãªãºã ã«ãªã£ã¦ãã¾ããmostly compaction algorithm ã¨å¼ã°ãã¾ãã
GC.compact
ã®ããã®å¤æ´è¦æ¨¡ã¯å¤§å¤å¤§ãããããããããã¾ã åé¡ãæ®ã£ã¦ããããç¥ãã¾ããããå©ç¨ããéã¯ãããããããåé¡ããããªã¼ãã¨ããè¦æãæã£ã¦ãå©ç¨ä¸ãããå¤åããã¾ãèªåã§å¼ã¶ãããªãã®ã§ããªãã¨æãã¾ãï¼ãã¬ã¼ã ã¯ã¼ã¯ãå¼ãã§ãããããï¼ï¼ãä½ãåé¡ãè¦ã¤ãããæãã¦ä¸ããã
(ko1)
IO#set_encoding_by_bom
ã®è¿½å
- Added
IO#set_encoding_by_bom
to check the BOM and set the external encoding. [Bug #15210]
Unicode ãã¼ã¿ã®æåã«ãBOMãã¤ãã¦ãããã¨ãããã¾ããIOã«BOMãã¤ãã¦ããã°ãããã«ããããå¤é¨ã¨ã³ã³ã¼ãã£ã³ã°ãè¨å®ããBOMãèªã¿æ¨ã¦ã IO#set_encoding_by_bom
ã追å ããã¾ããã
ãªããIO 㯠binmode ã§éãã¦ããå¿ è¦ãããã¾ãã
io = open("with_bom", 'rb') p io.tell #=> 0 p io.external_encoding #=> #<Encoding:ASCII-8BIT> p io.set_encoding_by_bom #=> #<Encoding:UTF-8> p io.tell #=> 3 ï¼èªã¿æ¨ã¦ãããï¼ p io.external_encoding #=> #<Encoding:UTF-8>
(ko1)
Integer#[]
ãRangeããµãã¼ã
Integer#[]
now supports range operation. [Feature #8842]
nãããç®ã®æ°åã0ã1ãåãåºãInteger#[]
ã¨ããã¡ã½ãããããã®ã§ããããããç¯å²ã«å¯¾å¿ããã¾ããã
# 2ãããç®ãã5ãããç®ã¾ã§ã®4ããããåãåºã 0b01001101[2, 4] #=> 0b0011 0b01001100[2..5] #=> 0b0011 0b01001100[2...6] #=> 0b0011 # ^^^^ ãã®ä½ç½®ã®4ããããåãåºã # ãããæ¼ç®ã§åããã¨ããããªã (0b01001100 >> 2) & ((1 << 4) - 1)
ãããæ¼ç®ã¯ããã¨è¤éã«ãªãã®ã§ããããããã¨ãããããã¨ãã«ã¯ä¾¿å©ãªããããªãã§ããããã
(mame)
Method#inspect
ã®çµæããªããã«
Method#inspect
shows much information. [Feature #14145]
Method#inspect
ã®è¡¨è¨ããªããã«ãªãã¾ããã
å ·ä½çã«ã¯ã
- (1) ãã©ã¡ã¼ã¿ã®æ å ±
- (2) å®ç¾©ãããå ´æã®æ å ±
ã®äºã¤ã®æ å ±ãå ¥ãã¾ããã
def foo(a, b=1, *r, p1, k1: 1, rk:); end p method(:foo) #=> #<Method: main.foo(a, b=..., *r, p1, rk:, k1: ...) t.rb:2>
ãã®ã¨ãã(1) 㯠(a, b=..., *r, p1, k1: ...)
ã§ã(2) ã¯t.rb:2
ã§ãã
ãã®ã¡ã½ãããªãã ã£ãï¼ãã¨ããæãã¨ãããã inspect
ããã°è¯ããã¨è¨ãæå³ã§ã便å©ã«ãªã£ãããããªããã¨æãã¾ããpry ä¸ã 㨠$
ã§ãè²ã
æ
å ±åããããã§ããã
ä½è«ã§ãããæåã(1)ã¨(2)ã®éã¯ãå ´æã表ã "at" ã®æå³ã§ã@
ã§åºåã£ã¦ãã¾ããããã端æ«ä¸ã§ãã¡ã¤ã«åãã³ããããã¨ããã¹ãã¼ã¹åºåãã®ã»ãããããã«ã¯ãªãã¯ã ãã§æ¸ããã楽ãã¨ããçç±ã§ã¹ãã¼ã¹åºåãã«ãã¾ããããªãã»ã©ãªãã
(ko1)
Module#const_source_location
ã®è¿½å
- Added
Module#const_source_location
to retrieve the location where a constant is defined. [Feature #10771]
å®æ°ã®å®ç¾©ä½ç½®ãè¿ã Module#const_source_location
ã追å ããã¾ãããä½ç½®ã¯ [file_name, line_number]
ã®é
åã§è¿ãã¾ãã
class C class D end end p Object.const_source_location('C') #=> ["t.rb", 1] p Object.const_source_location('C::D') #=> ["t.rb", 2]
(ko1)
Module#autoload?
ã inherit
ãªãã·ã§ã³ã«å¯¾å¿
Module#autoload?
now takes aninherit
optional argument, like asModule#const_defined?
. [Feature #15777]
Module#autoload?
ã«ãç¶æ¿å
ã®ã¯ã©ã¹ã® autoload
ã®ç¶æ³ãè¦ããã©ãããæ示ãã inherit
ãªãã·ã§ã³ã追å ããã¾ãããããã©ã«ã㯠true
ã§ãã
ãµã³ãã«ã RDoc ããå¼ç¨ãã¾ãã
class A autoload :CONST, "const.rb" end class B < A end B.autoload?(:CONST) #=> "const.rb", found in A (ancestor) B.autoload?(:CONST, false) #=> nil, not found in B itself
(ko1)
ãããããFrozen ãªæååã«
Module#name
now always returns a frozen String. The returned String is always the same for a given Module. This change is experimental. [Feature #16150]NilClass#to_s
,TrueClass#to_s
andFalseClass#to_s
now always return a frozen String. The returned String is always the same for each of these values. This change is experimental. [Feature #16150]
ã¢ã¸ã¥ã¼ã«åãè¿ã Module#name
ããtrue.to_s
ãªã©ã®çµæããä¸æ㪠frozen ãªæååã«ãªãã¾ããã以åã¯ãæ¯åæ¸ãæãå¯è½ãªã¢ãã±ã¼ã·ã§ã³ãã¦ããã§ãããã
ã¡ãªã¿ã«ãSymbol#to_s
ã®çµæã frozen ã«ãããã£ã¦å®é¨ãè¡ãããããã§ããããã£ã¡ã¯ãã¾ããããªã㦠revert ããã¾ããã
(ko1)
ObjectSpace::WeakMap#[]=
ãã·ã³ãã«ãªã©ãä¿æã§ããããã«
ObjectSpace::WeakMap#[]=
now accepts special objects as either key or values. [Feature #16035]
ObjectSpace::WeakMap
ã¨ãããç´æ¥ä½¿ããã¨ãæ¨å¥¨ããã¦ããªãã¯ã©ã¹ã®è©±ãªã®ã§ãããã¯èªã¾ãªãã¦ããã§ããèªããªã
WeakMap
ã¯ããã·ã¥ã¿ãããªãªãã¸ã§ã¯ãã§ããããã¼ãå¤ãGCã«ååããããä¸èº«ãåæã«æ¶ãã¾ãã
o = ObjectSpace::WeakMap.new o["key"] = "value" p o.size #=> 1 GC.start p o.size #=> 0
æ¶ãããã¨ã¯GCã«ä¾åãã¦ãã¦ä¿è¨¼ã¯ããã¦ãªãã®ã§ãã¤ã¡ã¼ã¸ã§ãããã¨# frozen-string-literal: true
ã ã¨æ¶ããªãã®ã§æ³¨æã
WeakMap
ã¯å
é¨çã«ããã¼ãå¤ã«ãã¡ã¤ãã©ã¤ã¶ãè¨å®ããã®ã§ãã·ã³ãã«ãæ°å¤ã®ããã«ãã¡ã¤ãã©ã¤ã¶ãè¨å®ã§ããªããªãã¸ã§ã¯ããæããããã¨ã¯ã§ãã¾ããã§ããã
ããä»åããã許ãããã«ãã¾ãããWeakMap
ããã£ãã·ã¥çã«ä½¿ãä¸ã§ãã®å¶éãé¢åã ã£ããããã¨ãããã¨ã§ãããããããç´æ¥å©ç¨ãæ¨å¥¨ããã¦ãªãã¯ã©ã¹ãªã®ã§ãä½ãèµ·ãããããããã¾ãããçæããè¦å®ã£ã¦ããã¾ãããã
(mame)
$LOAD_PATH.resolve_feature_path
ã®è¿½å
Ruby 2.6ã§ãrequire
ãå¼ãã ã¨ãã«èªã¿è¾¼ã¾ãããã¡ã¤ã«ãç¹å®ããRubyVM.resolve_feature_path
ã¨ããã¡ã½ãããå
¥ãã¾ããããããã$LOAD_PATH
ã®ç¹ç°ã¡ã½ããã«ç§»åãã¾ããã
RubyVM
ã¯ããããMRIï¼Matz Ruby Implementationï¼ç¹æã®ãã®ãç½®ãã¨ãããªã®ã§ãããresolve_feature_path
ã¯ä»ã®å®è£
ã§ã使ãããå¯è½æ§ããããã¨ãããã¨ã§ãå¤ã«ç§»ããã¨ãããã¨ã«ãªãã¾ãããããå¤ãã®äººã使ãã¡ã½ããã§ããªãã®ã§Kernel
ã«ç½®ãã»ã©ã®ãã®ã§ããªããè¡ãå
ã«å°ããè°è«ã®æ«ã$LOAD_PATH
ã®ç¹ç°ã¡ã½ããã¨ãã大å¤å¾®å¦ãªä½ç½®ã«ãªãã¾ããã
(mame)
Unicodeã®ãã¼ã¸ã§ã³ãä¸ãã£ã
Update Unicode version to 12.1.0, adding support for U+32FF SQUARE ERA NAME REIWA. [Feature #15195]
Update Unicode Emoji version to 12.1 [Feature #16272]
対å¿ããUnicodeã®ãã¼ã¸ã§ã³ã11ãã12.1.0ã«ä¸ããã¾ããã
Unicode 12ã«ã¯ãã¨ãã°ãå°ãããããï¼U+1B150ï¼ãå
¥ã£ãããã§ããé è¤ã®ç°å¢ã§ã¯è¡¨ç¤ºã§ãã¾ããã§ããããããã¯insmallkanaextension
ã¨ããæåããããã£ãæã£ã¦ããããªã®ã§ãæ£è¦è¡¨ç¾ã§ããã«ãããã§ãã¾ãã
p /\p{insmallkanaextension}/ =~ "\u{1b150}" #=> 0
é常ã«å°éã§ãããæ®åããããã«ã¯æ©æµãåãã人ãããã®ã§ã¯ãªãã§ããããã
(mame)
Symbol#start_with?
ãSymbol#end_with?
ã®è¿½å
- Added Symbol#start_with? and Symbol#end_with? method. [Feature #16348]
ã¿ã¤ãã«ã®éãã§ãå
容ãã¡ã½ããåè¦ãã°ãããã¾ããããString
ã«ããäºã¤ã®ã¡ã½ããã Symbol
ã«è¿½å ããã¾ããã
String
ã¨Symbol
ã¯ãã©ãã§ç·ãå¼ããããã§ããããããã®è¾ºãæ´å²ã®ãã課é¡ã§ããSymbol åç主義è
ã¯ã¾ã£ããå¥ç©ã§ããã¨ä¸»å¼µããString éæ¿æ´¾ã¯åãã«ããã¨ä¸»å¼µãã¦ãã¾ããã©ã¡ããã¨ããã¨ãString éæ¿æ´¾ã®ã»ãã«æµãã¦ãã£ã¦ãããããªæ°ããã¾ããã
(ko1)
Time#ceil
ãTime#floor
ã¡ã½ããã®è¿½å
- Added Time#ceil method. [Feature #15772]
- Added Time#floor method. [Feature #15653]
Time
ãªãã¸ã§ã¯ãã¯ãå®ã¯ç§ããé«ã精度ã®æéï¼ããç§ï¼ãæã¤ãã¨ãã§ãã¾ãã
p Time.now.nsec #=> 532872900
Time#round
ã¨ãããã¡ã½ããã¯ãæéãç§ã§ä¸¸ããå¦çããã¾ãããåãããã«ãfloor
ï¼åãä¸ããï¼ã¨ ceil
ï¼åãä¸ããï¼ã追å ããã¾ããã
(ko1)
Time#inspect
ã Time#to_s
ã¨å¥ã«ãªããinspect
ã¯ããç§ã¾ã§åºå
Time#inspect
is separated fromTime#to_s
and it shows its sub second. [Feature #15958]
ã§ãRuby 2.6 ã¾ã§ã¯ãto_s
ãinspect
ã¯ç§ããç´°ããæ
å ±ãåãæ¨ã¦ã¦è¡¨ç¤ºãã¦ããã®ã§ãæ¯è¼ãããç°ãªãå¤ã®ã¯ãããp
ãªã©ã§è¦ãã¨åããã¨ããç¾è±¡ãããã¾ããã
ããã§ãTime#to_s
㨠Time#inpsect
ãåé¢ããTime#inpsect
ã¯ããã»ã«ã³ãã¾ã§ï¼ããããã°ï¼è¿ãããã«ãªãã¾ãããTime#to_s
ãå¤æ´ãããªãã£ãã®ã¯ãäºææ§ç¶æã®ããã ããã§ãã
t = Time.now p [t.to_s, t.floor.to_s] #=> ["2019-12-21 04:27:05 +0900", # "2019-12-21 04:27:05 +0900"] # .to_s ã ã¨åãã«è¦ãã p [t.inspect, t.floor.inspect] #=> ["2019-12-21 04:27:05.3067204 +0900", # "2019-12-21 04:27:05 +0900"] # .inspect ã ã¨å¥ç©ã ã¨ããã p t.round == t #=> false
(ko1)
UnboundMethod#bind_call
ã®è¿½å
- Added UnboundMethod#bind_call method. [Feature #15955]
Rubyä¸ç´è åãã®æ©è½ã§ããæ®éã®ããã°ã©ã ã§ã¯ä½¿ããªãã§ãã ããã
ã¯ã©ã¹ãç¶æ¿ãã¦ã¡ã½ããããªã¼ãã¼ã©ã¤ãããã¨ãæ°ããã¡ã½ãããå¼ã°ããããã«ãªãã¾ãã
class Foo def foo "foo" end end class Bar < Foo def foo # override "bar" end end obj = Bar.new p obj.foo #=> "bar"
å½ããåã§ãããããããé»éè¡çãªã±ã¼ã¹ã§ããã¾ãã«ããªã¼ãã¼ã©ã¤ããããåã®ã¡ã½ãããå¼ã³åºããããã¨ããè¦æ±ãããã¾ãããã®ã¨ããUnboundMethod#bind
ã¨Method#call
ãçµã¿åãããæªéã¤ãã£ãªã ã使ã人ããã¾ãã
p Foo.instance_method(:foo).bind(obj).call #=> "foo"
Foo
ã®ã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãããªãã¸ã§ã¯ãï¼UnboundMethod
ï¼ãåãåºãããããã¿ã¼ã²ãããªãã¸ã§ã¯ãã«bind
ãã¦ãcall
ããã®ã§ããªã¼ãã¼ã©ã¤ããããåã®ã¡ã½ãããå¼ã³åºãã¦ãã¾ãã¾ããããããbind
ãã¦call
ããã®ã¯çµæ§éããæ¼ç®ãªã®ã§ãã¾ã¨ãã¦ããã°å¤å°éããªããã¨ãããã¨ã§bind_call
ãå°å
¥ããã¾ããã
p Foo.instance_method(:foo).bind_call(obj) #=> "foo"
ãªãããã®æªéã¤ãã£ãªã ãå¿
è¦ã«ãªãã®ã¯ãpp
ãã©ã³ã¿ã¤ã ã¢ãã¿ã®ããã«ãã©ããªãªãã¸ã§ã¯ããæ¥ãã®ãã¾ã£ããäºæ³ã§ããªãã¨ããã±ã¼ã¹ã§ããæ®éã®ããã°ã©ã ã§ã¯æ±ºãã¦ä½¿ããªãã§ãã ããã
(mame)
è¦åã®ã«ãã´ãªå¥ãã£ã«ã¿ã®è¿½å ï¼Warning.[]
, Warning.[]=
ã®è¿½å ï¼
- Added
Warning.[]
andWarning.[]=
to manage emit/suppress of some categories of warnings. [Feature #16345]
Warning[category] = true or false
ã¨ãããã¨ã§ãcategory
ã«å±ããè¦åããæå¹ or ç¡å¹ã«ãããã¨ãã§ããããã«ãªãã¾ããã
Ruby 2.7 ã§ã¯äºææ§ãå¤æ´ããã¨ãããå¤ããã¾ã¨ãã¦è¦åãæ¶ãæ¹æ³ãè°è«ããã¾ããããã ããã¹ã¦ã®è¦åãæ¶ãã¦ãã¾ãã¨ãèå³ããããããããªãè¦åãä¸ç·ã«æå¶ãã¦ãã¾ãã¾ãã
ããã§ãããã«ãã´ãªã®è¦åã®ã¿æå¹ã»ç¡å¹ãå¶å¾¡ããããã¨ãããã¨ã§ãWarning.[]
ããã³ Warning.[]=
ã追å ããã¾ãããç¾å¨ã«ãã´ãªã¯ :deprecated
ï¼é対å¿è¦åï¼ã:experimental
ï¼å®é¨æ©è½è¦åï¼ã®äºã¤ã ãããããã¾ãããä»å¾ãæ´çããã¦ããã®ã§ã¯ãªãã§ããããï¼ã§ããªãã誰ãããã®ããªãï¼ã
Warning[:deprecated] = false def foo proc # ããã©ã«ãã§ã¯ deprecated è¦åãåºããããã®è¦åãæå¶ãã end foo{}
(ko1)
æ¨æºæ·»ä»ã©ã¤ãã©ãªã®ã¢ãããã¼ã
ã©ã¤ãã©ãªããããããã¢ãããã¼ããã¾ãããNEWS ã«ããã¤ãè¼ã£ã¦ãã¾ãããèå³ã®ããã¨ããã ããç´¹ä»ãã¾ãã
ã¨ã¹ã±ã¼ããããã¨ããCGI.escapeHTML
ã2ï½5åé«éå
- CGI.escapeHTML becomes 2~5x faster when there's at least one escaped character. https://github.com/ruby/ruby/pull/2226
CGI.escapeHTML
ãéããªã£ãããã§ãã
(ko1)
IRBã®å·æ°
irbãå·æ°ããã次ã®ãããªæ©è½ãæè¼ããã¾ããã
- è¤æ°è¡ç·¨é
- ãªã¼ãã¤ã³ãã³ã
- ã¡ã½ããåè£å®
- ããã¥ã¡ã³ãï¼rdocï¼æ¤ç´¢
- ã·ã³ã¿ãã¯ã¹ãã¤ã©ã¤ã
æç« ã§ãã¡ããã¡ã説æããã®ã¯ç¡ç²ãªã®ã§ããã²å®éã«ä½é¨ãã¦ãã ããããã¾ãã2.7ãã¤ã³ã¹ãã¼ã«ã
â¦â¦ãããã«åºæ¥ãªã人ã¯ãå®ã¯2.6ã§ãåãã®ã§ãgem install irbãã¦ã¿ã¦ãã ãããâ¦â¦ãããé£ãã人ã¯ããªãªã¼ã¹ã¢ãã¦ã³ã¹ã«è¼ã£ã¦ããåç»ãè¦ã¦é°å²æ°ãæãã¦ãã ããã
Rubyã®å¯¾è©±çç°å¢ã¨ããã¨ãã£ããpryä¸è²ã§ããããirbã追ãã¤ã追ãè¶ãé¢ãåºã¦ããã®ã§ã競äºã§ä¾¿å©ã«ãªãã¨ããã§ãããpryãè¤æ°è¡ç·¨éã®ãµãã¼ããèãã¦ããã¨ããåã§ãã
IRBã®å·æ°: ãããã¨æ³¨æç¹
ã¿ã¼ããã«ã¨ããã®ã¯ãã¿ã¤ãã©ã¤ã¿ã®æ代ããæ¹è¯ãç¶ãããã¦ããè¶ çµ¶ã¬ã¬ã·ã¼ã§ãæå¤ã¨å¤§å¤ã§ããè²ãä»ããããããªãç°¡åãªã®ã§ãããè¤æ°è¡ç·¨éã»ãªã¼ãã¤ã³ãã³ãã»è£å®ã¨ãªãã¨ãã¡ãã£ã¨ããã¨ãã£ã¿ã«ãªãã¾ãããããLinuxã ãã§ãªãWindowsã®ã³ã³ã½ã¼ã«ã§ãåãã¾ããJRubyã§ãåãã¾ããncursesã¿ãããªã©ã¤ãã©ãªã¯ããããå¶ç´ããã£ã¦ä½¿ããªãã®ã§å ¨é¨èªåã§ãã£ã¦ãã¦ãç°¡æscreenãtmuxãããã®è¤éãã«ãªã£ã¦ã¾ãããããã¡ããã¨åãã¦ããã®ã§ãããã
ä¸æ¹ã§ãä»åMRIã®ããã±ã¼ã¸ã«å«ã¾ããã¯ããã¦åºã使ããããã¨ã«ãªãã¾ããå
ã«è¿°ã¹ãéãã¿ã¼ããã«ã¨ããã®ã¯è¶
絶ã¬ã¬ã·ã¼ã§ãã¿ã¼ããã«ã«ãã£ã¦æåã®éãããã£ãããã³ã¼ãã¼ã±ã¼ã¹ããã£ãããã¾ãããã®æ¹è¯ãæãéãã糸æ³ããã¯2018å¹´ããããéçºãå§ãããããªã®ã§ãæ§ã
ãªç°å¢ã»ä½¿ãæ¹ã¯çµé¨ã§ãã¦ããããæ¯ãã¦ããã¨ã¯è¨ãã¾ããããã²ä½¿ã£ã¦ã¿ã¦ãããããªæåãè¦ã¤ããããã£ã¼ãããã¯ãã¦ãã ããããã¨ããããä»åããªãã¦å°ãï¼ãã¨ããã¨ãã¯ãirb --legacy
ã¨ãããªãã·ã§ã³ä»ãã§èµ·åããã°ãããããå¾æ¥ãã¼ã¸ã§ã³ã§åãã¾ãã
(mame)
OptionParserã§ãªãã·ã§ã³ãtypoãããdid you meanã表示ãããããã«
Rubyã«ã¯ãã°ããåããdid_you_mean gemãçµã¿è¾¼ã¾ãã¦ãã¦ãã¡ã½ããåãå®æ°åã®typoã§ä¿®æ£åè£ãåºãã¦ããã¾ããããããOptionParserã«ãçµã¿è¾¼ãã§ã¿ã¾ããã
$ ruby test.rb --hepl Traceback (most recent call last): tt:6:in `<main>': invalid option: --hepl (OptionParser::InvalidOption) Did you mean? help
--help
ãæã¡ééãã¦--hepl
ã¨ãã¦ãã¾ã£ã¦ãã¾ããã"Did you mean? help"ã¨ãããµãã«ä¿®æ£åè£ãæãã¦ããã¾ãã
test.rbã¯æ®éã«OptionParserã使ã£ã¦ããã ãã§ãã
require 'optparse' OptionParser.new do |opts| opts.on("-f", "--foo", "foo") {|v| } opts.on("-b", "--bar", "bar") {|v| } opts.on("-c", "--baz", "baz") {|v| } end.parse!
(mame)
éäºæ
The following libraries are no longer bundled gems. Install corresponding gems to use these features.
- CMath (cmath gem)
- Scanf (scanf gem)
- Shell (shell gem)
- Synchronizer (sync gem)
- ThreadsWait (thwait gem)
- E2MM (e2mmap gem)
ãããã®ã©ã¤ãã©ãªã¯ bundled gemï¼ã¤ã¾ããRuby ã®ã¤ã³ã¹ãã¼ã«æã«åæã«ã¤ã³ã¹ãã¼ã«ããã gemï¼ã§ã¯ãªããªãã¾ãããããå¿
è¦ãªããGemfile
ãªã©ã«å
¥ããããã«ãã¦ä¸ããã
(ko1)
Proc#to_s
ã®ãã©ã¼ããããå¤ãã£ã
- Proc#to_s format was changed. [Feature #16101]
Proc#to_s
ï¼Proc#inspect
ãaliasãªã®ã§åãï¼ã¯ããã¡ã¤ã«åã¨è¡çªå·ãå«ãã æååãè¿ãã¾ãï¼Proc ãçæããå ´æã§ãï¼ã2.6 ã§ã¯ã[email protected]:123
ã ã£ãã®ãã... file.rb:123
ã®ããã«ã@
ã空ç½ã«å¤ããã¾ããã
ã¤ã¾ãããããªæãã§ãã
p proc{}.to_s #=> # Ruby 2.6 # "#<Proc:[email protected]:1>" # Ruby 2.7 # "#<Proc:0x0000024cc385c3e0 t.rb:1>"
Method#to_s
ã«ããããå¤æ´ã§ããã
ããããéããããªããã§ãããminitest ã®ãã¹ãã ã£ããã§ãæ£è¦è¡¨ç¾ã使ã£ã¦ãã¡ã¤ã«åãåãåºãã¦ããã³ã¼ãããã£ã¦ã失æãã¡ãã£ã¦ã¾ããã念ã®ããéäºæã®ã¨ããã«å ¥ãã¦ãã¾ãã
(ko1)
ã©ã¤ãã©ãªã®éäºæ
Gemå
- Promote stdlib to default gems
- The following default gems was published at rubygems.org
- benchmark
- cgi
- delegate
- getoptlong
- net-pop
- net-smtp
- open3
- pstore
- singleton
- The following default gems was published at rubygems.org
ãããã®ã©ã¤ãã©ãªã¯ããã©ã«ãgemã«ãªãã¾ãããrubygems.orgã§ãå ¬éããã¾ãã
- The following default gems only promoted ruby-core, Not yet published at rubygems.org.
- monitor
- observer
- timeout
- tracer
- uri
- yaml
ãããã®ã©ã¤ãã©ãªã¯ããã©ã«ãgemã«ãªãã¾ããããrubygems.org ã§ã¯ã¾ã å ¬éããã¦ãã¾ããï¼èª¿æ´ä¸ã ããã§ãï¼ã
- The
did_you_mean
gem has been promoted up to a default gem from a bundled gem
did_you_mean
gem ããbundled gem ãã default gem ã«ãªãã¾ããã
(ko1)
Pathname()
Kernel#Pathname
when called with a Pathname argument now returns the argument instead of creating a newPathname
. This is more similar to other Kernel methods, but can break code that modifies the return value and expects the argument not to be modified.
Pathname(obj)
ã§ãobj
ãPathanme
ã ã£ãã¨ããæ°ããPathname
ãè¿ãã®ã§ã¯ç¡ããobj
èªèº«ãè¿ãããã«ãªãã¾ããã
p1 = Pathname('/foo/bar') p2 = Pathname(p1) p p1.equal?(p2) #=> Ruby 2.6: false # Ruby 2.7: true #=>
(ko1)
profile.rb, Profiler__
- Removed from standard library. No one maintains it from Ruby 2.0.0.
æ¨æºã©ã¤ãã©ãªããå¤ããã¾ããã誰ãã¡ã³ããã³ã¹ãã¦ããªãããã¨ã®ãã¨ã§ããGem ã§æä¾äºå®ã§ããã調æ´ä¸ã¨ã®ãã¨ã§ãã
(ko1)
ã³ãã³ãã©ã¤ã³ãªãã·ã§ã³ã®å¤æ´
-W:(no-)category
ãªãã·ã§ã³ã®è¿½å
-W
option has been extended with a following:
, to manage categorized warnings. [Feature #16345] [Feature #16420]
Warning[category] = true or false
ã®æ©è½ããã³ãã³ãã©ã¤ã³ã§ãæå®ã§ããããã«ãªãã¾ããã
- è¦åãæå¹ã«ãã:
-W:category
- è¦åãç¡å¹ã«ãã:
-W:no-category
ã¨æå®ãã¾ããWarining[category]
ã¨åæ§ãç¾å¨ã«ãã´ãªã¯ deprecated
㨠experimental
ã®äºã¤ã§ãã
å©ç¨ä¾ï¼
# deprecation warning $ ruby -e '$; = ""' -e:1: warning: `$;' is deprecated # suppress the deprecation warning $ ruby -W:no-deprecated -e '$; = //' # works with RUBYOPT environment variable $ RUBYOPT=-W:no-deprecated ruby -e '$; = //' # experimental feature warning $ ruby -e '0 in a' -e:1: warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby! # suppress experimental feature warning $ ruby -W:no-experimental -e '0 in a' # suppress both by using RUBYOPT $ RUBYOPT='-W:no-deprecated -W:no-experimental' ruby -e '($; = "") in a'
(ko1)
C API ã®å¤æ´
- Many
*_kw
functions have been added for setting whether the final argument being passed should be treated as keywords. You may need to switch to these functions to avoid keyword argument separation warnings, and to ensure correct behavior in Ruby 3.
Ruby 3 ã§ãã¼ã¯ã¼ãåé¢ãè¡ãããã«ã_kw
ã§çµããé¢æ°åã®é¢æ°ã追å ããã¾ããã
- The
:
character in rb_scan_args format string is now treated as keyword arguments. Passing a positional hash instead of keyword arguments will emit a deprecation warning.
rb_scan_args()
ã®ãã©ã¼ãããæåå :
ãæå¾ã®ãªãã·ã§ãã«ããã·ã¥ã§ã¯ãªããææ°ã®ãã¼ã¯ã¼ãå¼æ°ã®æå³ã«ãããã¾ããã
- C API declarations with
ANYARGS
are changed not to useANYARGS
https://github.com/ruby/ruby/pull/2404
é¢æ°ãã¤ã³ã¿ãåãåãã¨ãããã®å¼æ°ããããããããã¨ããã®ã示ã ANYARGS
ã¨ããæ©è½ã使ããªããªãã¾ãããã¡ããã¨é¢æ°ãã¤ã³ã¿ã®åãæ¸ãã¾ãããããã¨ãã話ã§ãã
(ko1)
æ§è½åä¸
Ruby 2.7åãã«è¡ãããæ§è½åä¸ã«ã¤ãã¦ã§ãã
Fiberã¨ã¹ã¬ããã®å®è£ åä¸
- Allow selecting different coroutine implementation by using
--with-coroutine=
, e.g.
./configure --with-coroutine=ucontext ./configure --with-coroutine=copy
configure
ã§ãFiberã®å®è£
æ¹æ³ãé¸ã¹ãããã«ãªãã¾ãããããã¾ããæ°ã«ããå¿
è¦ã¯ç¡ãã§ãããï¼ããã©ã«ãã§ããã§ãããï¼ã
- Replace previous stack cache with fiber pool cache. The fiber pool allocates many stacks in a single memory region. Stack allocation becomes O(log N) and fiber creation is amortized O(1). Around 10x performance improvement was measured in micro-benchmarks. https://github.com/ruby/ruby/pull/2224
Fiber
ã®ããã«å²ãå½ã¦ãããã¹ã¿ãã¯ã®æ¦ç¥ãè²ã
ã¨æ¹åãã¦ãFiber
ã®çæã¨ãã10åãããéããªãã¾ããããã£ãï¼
ç°å¢ã«ãããã§ãããmmap
ã§ãã¼ã³ã¨å¤§ããªé åã確ä¿ãã¦ããããããåå²ãã¦ä½¿ã£ã¦ããã¨ããæ¦ç¥ã«ãªãã¾ãã
- VM stack memory allocation is now combined with native thread stack, improving thread allocation performance and reducing allocation related failures. ~10x performance improvement was measured in micro-benchmarks.
åããããªè©±ãªãã§ãããVMã¹ã¿ãã¯ããã·ã³ã¹ã¿ãã¯ãã alloca
ã§åå¾ãããã¨ã«ãããVMã¹ã¿ãã¯å²ãå½ã¦æéãéåã¸ãã¾ãããããã 10 åãããéããªã£ãããã§ãã... ä½ã¨æ¯ã¹ã¦ã ããï¼
(ko1)
realpath(3)
ã®å©ç¨
- File.realpath now uses realpath(3) on many platforms, which can significantly improve performance.
使ãããªãrealpath(3)
ãå©ç¨ãããã¨ã§æ§è½ãåä¸ããããã§ãï¼ããç¥ããªãï¼ã
(ko1)
Hash ã®ãã¼ã¿æ§é ã®æ¹å
- Change data structure of small Hash objects. [Feature #15602]
å°ããããã·ã¥ï¼å ·ä½çã«ã¯ 1ï½8 è¦ç´ ï¼ãå¿ è¦ã¨ããã¡ã¢ãªãã192ãã¤ãã ã£ãã®ã128ãã¤ãã«ãªãã¾ããï¼64ãããç°å¢ï¼ã
ãã¼ã¨å¤ã®ãã¢ãã¨ã«ããã·ã¥å¤ãä¿åãã¦ããã®ãã1ãã¤ãã ãä¿åããããã«å¤ãããã¨ã§å®ç¾ãã¦ãã¾ããå¹æããã¨ãããªãã
(ko1)
Monitor
ã®Cå®è£
åã«ããé«éå
Monitor
class is written in C-extension. [Feature #16255]
Monitor
ã¯ã©ã¹ï¼MonitorMixin
ã¢ã¸ã¥ã¼ã«ï¼ã¯Rubyã§æ¸ããã¦ããã®ã§ãããhandle_interrupt
ã¨ããæ©è½ã使ã£ã¦å®è£
ãã¦ããã¨ãç¡è¦åºæ¥ãªããªã¼ããããã¨ãªã£ã¦ãã¾ã£ãããã§ããã¨ãã«ãRuby 2.6 ã§ãé©åãªå®è£
ã«ããããã«è¿½å ãã¦ããã³ã¼ããé
ãã£ãã¨ãã
ããã§ãC ã§æ¸ãç´ããã¨ã«ããã以åãããããããéããªãã¾ããã
(ko1)
ã¤ã³ã©ã¤ã³ã¡ã½ãããã£ãã·ã¥ã®æ¹å
- Per-call-site method cache, which has been there since around 1.9, was improved: cache hit rate raised from 89% to 94%. See https://github.com/ruby/ruby/pull/2583
ã¡ã½ããå¼ã³åºããè¡ãã¨ããã«ååã®ã¡ã½ããæ¢ç´¢çµæããã£ãã·ã¥ãã¦ããã¤ã³ã©ã¤ã³ã¡ã½ãããã£ãã·ã¥ã«ããã¦ãã¯ã©ã¹ã¯ä¸è´ããªããåãã¡ã½ãããåç §ããå ´åããããã®ã¯ã©ã¹ããã£ãã·ã¥ã®ãã¼ã¨ãã¦ä¿åãããã¨ã§ãã¡ã½ãããã£ãã·ã¥ãããå¹ãããã«ãªãã¾ããã
discourse ãã³ããã¼ã¯ã¨ãããRails ã¢ããªã対象ã«ããå®é¨ã«ããã¦ãã¤ã³ã©ã¤ã³ã¡ã½ãããã£ãã·ã¥ã®ãããçã89%ãã94%ã«åä¸ããããã§ããRuby ã§ã¡ã½ããå¼ã³åºãã¯å¤§éã«è¡ãããå¦çãªã®ã§ããããéããªãã®ã¯å¤§å¤éè¦ãªããã§ãã
(ko1)
JITã®æ¹å
- JIT-ed code is recompiled to less-optimized code when an optimization assumption is invalidated.
é«åº¦ãªæé©åã®ããã«ãããã¤ãåæã¨ããæ¡ä»¶ãããã®ã§ããããã®æ¡ä»¶ãå¤ããã¨ãããã®æ¡ä»¶ãç·©åãã¦ããã®æé©åãè¡ããªããã¼ã¸ã§ã³ã«å度ã³ã³ãã¤ã«ããããã«ãªãã¾ããã
- Method inlining is performed when a method is considered as pure. This optimization is still experimental and many methods are NOT considered as pure yet.
ããã¥ã¢ããªã¡ã½ãããã¤ã³ã©ã¤ã³åããå®é¨çãªæ©è½ãå®è£ ããã¾ãããããã¥ã¢ãã®å®ç¾©ã¯é¢åãªã®ã§çç¥ãã¾ãããã»ã¨ãã©ã®å ´åããã¥ã¢ãããªãã¨æãã¾ãã
- Default value of
--jit-max-cache
is changed from 1,000 to 100
--jit-max-cache
ã¨ãããã©ã¡ã¼ã¿ã®ããã©ã«ãã1,000ãã100ã«ãªãã¾ãããããã¯ä½ãã¨ããã¨ãä½åã®ã¡ã½ãããJITããã¾ã¾ã«ãã¦ããããã¨ããæ°ã«ãªãã¾ãã
- Default value of
--jit-min-calls
is changed from 5 to 10,000
--jit-min-calls
ã¨ãããã©ã¡ã¼ã¿ã®ããã©ã«ãå¤ãã5ãã1ä¸ã«ãªãã¾ããããã®ãã©ã¡ã¼ã¿ã¯ãä½åå¼ã°ãããJITã³ã³ãã¤ã«ãããããã®ãããå¤ã«ãªãã¾ãã
(ko1)
ã³ã³ãã¤ã«æ¸ã¿å½ä»¤åã®ãµã¤ãºåæ¸
- RubyVM::InstructionSequence#to_binary method generate compiled binary. The binary size is reduced. [Feature #16163]
RubyVM::InstructionSequence#to_binary
ã¨ããã¡ã½ããã§ãVMãå®è¡ããå½ä»¤åããããããã¤ãã³ã¼ãããã¤ããªã«å¤æããåºåãããã¨ãã§ãã¾ãããããã®ãã¤ããªã¯ãBootsnap ãªã©ã§å©ç¨ããã¦ãããRubyã¢ããªã±ã¼ã·ã§ã³ã®èµ·åã®é«éåã«å©ç¨ããã¦ãã¾ãã
ãã®åºåã¯ãé常ã«ç¡é§ãå¤ããã©ã¼ãããã ã£ãã®ã§ãã¯ãã¯ãããã«ã¤ã³ã¿ã¼ã³ã«æ¥ã¦é ãã永山ããã«ãä»æ§ãæ¤è¨ãã¦ããããã¹ãªã ã«ãã¦åºåãµã¤ãºãåæ¸ãã¦ãããã¾ããã詳細ã¯Rubyä¸é表ç¾ã®ãã¤ããªåºåãæ¹åãã - ã¯ãã¯ãããéçºè ããã°ããåç §ä¸ããã
(ko1)
ãã®ä»
ãã®ã»ãã®å¤æ´ã§ãã
IA64 ã®ãµãã¼ããä¸æ¢
- Support for IA64 architecture has been removed. Hardware for testing was difficult to find, native fiber code is difficult to implement, and it added non-trivial complexity to the interpreter. [Feature #15894]
Itaniumã®è£½é ã£ã¦çµäºãããããã§ãããã¨ããããã§ããããµãã¼ãããããããã¨ãããã¨ã«ãªãã¾ãããçµæ§ç¹æ®ãªå¦çãå ¥ã£ã¦ããã§ãããã
(ko1)
C99ã®å©ç¨
- Require compilers to support C99 [Misc #15347]
- Details of our dialect: https://bugs.ruby lang.org/projects/ruby-trunk/wiki/C99
MRIã®å®è£
ããC89 ã§ã¯ãªããC99 ãç¨ãã¦æ¸ããã¨ãã§ããããã«ãªãã¾ããï¼ããã¤ãå¶éãããã¾ãï¼ã//
ã³ã¡ã³ããæ¸ããããã«ãªã£ãï¼ãã§ãããã20å¹´åã®ä»æ§ãããã
(ko1)
Gitå
- Ruby's upstream repository is changed from Subversion to Git.
ã½ã¼ã¹ã³ã¼ãã Git ã§ç®¡çãããããã«ãªãã¾ãããGithub ã§å ¨é¨ç®¡çããããããªãã¦ãGit ãªãã¸ããªãå¥ã«ããããã㨠Github ã®ãªãã¸ããªãè¯ãæãã«åæãã¦ãããããªæ§æã«ãªã£ã¦ãã¾ãã
RUBY_REVISION
class is changed from Integer to String.
Git åã«ã¨ããªããä»ã¾ã§ Subversion ã®ãªãã¸ã§ã³ï¼æ°å¤ï¼ã ã£ã RUBY_REVISION
ããGit ã®ã³ãããããã·ã¥ã«ãªãã¾ããã
p RUBY_REVISION #=> "fbe229906b6e55c2e7bb1e68452d5c225503b9ca"
RUBY_DESCRIPTION
includes Git revision instead of Subversion's one.
åãããSubversion ã®ãªãã¸ã§ã³ãå«ãã§ãã RUBY_DESCRIPTION
ãã³ãããããã·ã¥ãå«ãããã«ãªãã¾ããã
p RUBY_DESCRIPTION #=> "ruby 2.7.0dev (2019-12-17T04:15:38Z master fbe229906b) [x64-mswin64_140]" # éçºçã®è¡¨è¨ãªã®ã§ããªãªã¼ã¹çã¯å¤åã¾ãéããã ã¨æãã¾ãã
(ko1)
çµè¾¼ã¯ã©ã¹ã Ruby ã§æ¸ãããã®ãµãã¼ã
- Support built-in methods in Ruby with
__builtin_
syntax. [Feature #16254] Some methods are defined in *.rb (such as trace_point.rb). For example, it is easy to define a method which accepts keyword arguments.
RubyKaigi 2019 ã§ç§ãçºè¡¨ããå 容ï¼è©³ç´°ã¯ RubyKaigi 2019: Write a Ruby interpreter in Ruby for Ruby 3 - ã¯ãã¯ãããéçºè ããã°ï¼ã®è©±ã§ãã
ç°¡åã«ã¾ã¨ããã¨ãç¾å¨ã¯ Array
ãªã©ã®çµè¾¼ã¯ã©ã¹ã¯Cã§è¨è¿°ãããããªãã£ãã®ããRubyã¨Cãç°¡åã«çµã¿åããããã¨ã§æ¸ãããã¨ãããã®ã§ãã
ç¾å¨ã¯ãããã¤ãã®ã¯ã©ã¹ï¼ä¾ãã°ãtrace_point.rb
ã¨ãããã¡ã¤ã«ã§ TracePoint
ã®å®ç¾©ãæ¸ãã¦ããã¾ãï¼ã§ã ãå©ç¨ãã¦ãã¾ãããä»å¾ã¯ãã¡ãã«å¯ãã¦ããããã¨æã£ã¦ãã¾ãï¼:contribution_chance:ï¼ã
ãã®ä»çµã¿ã«ã¤ãã¦ã®è©³ç´°ã¯ãã¾ãä»åº¦ã¾ã¨ãããã¨æãã¾ãã
ãªãããã®ä»çµã¿ãå ¥ããåæã¨ãã¦ãåè¿°ã®ã³ã³ãã¤ã«æ¸ã¿å½ä»¤åã®ãµã¤ãºåæ¸ãå½¹ã«ç«ã¡ã¾ããã
(ko1)
ãããã«
Ruby 2.7 ããæ§ã ãªå¤æ´ãããã¾ããããã²ã使ã£ã¦ã¿ã¦ãã ããã
æ¥å¹´ã¯ã¤ãã« Ruby 3 ã®ãªãªã¼ã¹ãäºå®ããã¦ãã¾ãã楽ãã¿ã§ãããã¡ããã¨åºãã¨ãããªãã
ã§ã¯ãã¡ãªã¼ã¯ãªã¹ãã¹ï¼