ããã«ã¡ã¯ããããã¯ããã°ãã¯ã @gessy0129 ã§ãã æ²çžãè¡ã£ãŠããŸããïŒ èŠ³å
ãããŸããã§ããïŒ ãšãŠã楜ããã£ãã§ãïŒ ä»åããã¡ã€ã³ãã£ããŒã¹ã§ã¯ã RubyæŽÃRubyé¢é£ã®ã«ã³ãã¡ã¬ã³ã¹åå åæ°ã¯ïŒ ãšããã¢ã³ã±ãŒããš æ¥æ¿ããã§Ruby Code Quiz ã宿œããŸããïŒ å
šäœçãªããŒã¹ã®è©±ã¯DevRelã® ãŸã£ã㌠ããŸãšããŠããã®ã§ãã¡ããã芧ãã ããïŒ note.com æ¬èšäºã§ã¯ããšã³ãžãã¢ãªãæ°ã«ãªãã§ãããFindy Ruby Code Quizã®è§£èª¬ãããŠãããããšæããŸãïŒã§ã¯ãæ©éèŠãŠãããŸãããïŒ äžæ¥ç® - RubyããŒãžã§ã³ã®çµã¿åãã åé¡ äžèšãå®è¡çµæã®RubyããŒãžã§ã³ã®çµã¿åãããçããŠãã ããã ãªããã²ãšã€ã®ããŒãžã§ã³ã¯ã²ãšã€ã®éžæè¢ã«ã®ã¿åçã§ããŸãã Ruby versions: 3.3.0 or 3.2.0 or 3.1.0 or 3.0.0 â irb> Time .new( " 2024-05-15T11:11:11Z " ) => 2024 - 05 - 15 11 : 11 : 11 UTC â¡ irb> Time .new( " 2024-05-15T11:11:11Z " ) => 2024 - 01 - 01 00 : 00 : 00 + 0000 ⢠irb> Time .new( " 2024-05-15T11:11:11Z " ) <internal :timev >: 310:in ` initialize': invalid value for Integer(): "2024-05-15T11:11:11Z" (ArgumentError) ⣠irb> Time .new( " 2024-05-15 " ) <internal :timev >: 409:in ` initialize': no time information (ArgumentError) éžæè¢ â : 3.2.0ãâ¡: 3.0.0ãâ¢: 3.1.0ãâ£: 3.3.0 â : 3.3.0ãâ¡: 3.2.0ãâ¢: 3.1.0ãâ£: 3.0.0 â : 3.1.0ãâ¡: 3.0.0ãâ¢: 3.2.0ãâ£: 3.3.0 â : 3.0.0ãâ¡: 3.1.0ãâ¢: 3.3.0ãâ£: 3.2.0 æ£è§£ãšåçç æ£è§£ â
1. â : 3.2.0ãâ¡: 3.0.0ãâ¢: 3.1.0ãâ£: 3.3.0 åçç 14.15ïŒ
53.77ïŒ
19.81ïŒ
12.26ïŒ
解説 Rubyã®ããŒãžã§ã³ã¢ããã®NEWSã远ããããŠããã°è§£ãããšããåé¡ã§ãã Ruby3.3.0ã®NEWS https://github.com/ruby/ruby/blob/v3_3_0/NEWS.md Time.new('2023-12-20') # no time information (ArgumentError) ãããç¥ã£ãŠãããâ£ã3.3.0ã ãšããããŸãã Ruby3.2.0ã®NEWS https://github.com/ruby/ruby/blob/v3_2_0/NEWS.md Time.new now can parse a string like generated by Time#inspect and return a Time instance based on the given argument. Time.newã¯inspectãåºåããstringããããŒã¹ã§ããããã«ãªã£ããããã§ãâ ã¯3.2.0以äžãšããããŸãã Ruby3.1.0ã®NEWS https://github.com/ruby/ruby/blob/v3_1_0/NEWS.md At the same time, time component strings are converted to integers more strictly now. Time.new(2021, 12, 25, "+07:30") #=> invalid value for Integer(): "+07:30" (ArgumentError) Ruby 3.0 or earlier returned probably unexpected result 2021-12-25 07:00:00, not 2021-12-25 07:30:00 nor 2021-12-25 00:00:00 +07:30. ãããã3.1.0ãŸã§ã¯æååã ããããããŠãŒã¹ã±ãŒã¹ã¯ãªãã£ãããã§ãã3.0.0以åã¯æååã ãã ãšããããããªãæåã«ãªã£ãŠãããã©ããã®å¯Ÿå¿ã§ãã§ãã¯ãå³å¯ã«ããããšã§æååã ãã ãšãšã©ãŒã«ãªã£ãã®ã§ã¯ãªãããšæšæž¬ããŸãã倿޿å³ãªã©ã¯Commiterã®æ¹ã
ã«è§£èª¬æ±ãããéšåã§ãã ãã ããã®NEWSã®å
容ãå
šãŠãèšæ¶ããŠãã®ã¯é£ãããã«ãªã£ãŠããŸãã®ã§ãåçã®éžæè¢ã4æã«ããŠããŸãã4æãªã®ã§3.3.0ã®æåãç¥ã£ãŠããã1çªç®ãš3çªç®ã®2æã«çµãããšæããŸãã ããã«å ããŠã3.2.0ã®æåãç¥ã£ãŠãããâ ã¯3.2.0以äžãšãããã®ã§1çªç®ãçãã ãšããããŸãããŸãã3.2.0ã®æåãç¥ããªãã£ããšããŠããâ ãâ¢ã¯å
šãåãã³ãã³ããå®è¡ããŠããâ ãæ£ããæåããŠããã®ã§â ã®æ¹ãæ°ããããŒãžã§ã³ã ãšæšæž¬ã§ããŸããããã§ã1çªç®ãçãã ãšãããããã«ãªã£ãŠãŸãã äºæ¥ç® - 代å
¥ãããŠãããªããžã§ã¯ãã¯ã©ãïŒ åé¡ fooã«ä»£å
¥ãããŠãããªããžã§ã¯ãã¯æ¬¡ã®ãã¡ã©ãã§ããããïŒ (Ruby: 3.3.0ã§å®è¡ããå Žå) irb(main): 001 > foo = ?? ? irb(main): 002 > foo.include?( 3 / 2 ) => true irb(main): 003 > (foo + [ 3 ]).inject( :+ ) => 9 irb(main): 004 > foo.last => NoMethodError éžæè¢ 1..3 [1, 2, 3] Set.new([1, 2, 3]) Enumerator.new { |y| [1, 2, 3].each { |i| y << i } } æ£è§£ãšåçç æ£è§£ â
4. Enumerator.new { |y| [1, 2, 3].each { |i| y << i } } åçç 25.37ïŒ
4.88ïŒ
39.02ïŒ
30.73ïŒ
解説 ã¡ãœããã«å¯ŸããŠã®åºåçµæããå
ã®å€ãåœãŠã ãšããåé¡åœ¢åŒã䜿ã£ãŠã¿ããã£ãåé¡ã§ãã ããããéç®ããŠãã¡ãã£ãšäŒŒãŠããã¯ã©ã¹ïŒRange, Array, Set, EnumeratorïŒãåœãŠãããã«ããŠã¿ãŸããã irb(main):002 ã®åºåã¯åŒã£æãã§ã3/2 => 1ã«ãªãã®ã§ãã¹ãŠtrueã«ãªãã ããçŽæçã«ã¯3/2 => 1.5ãšããèããå©çšããŠã1..3ã§ã¯ïŒãšæãããŠåé¡ãé£ããããŸããã irb(main):003 ã¯ãåãå€ã¯éè€ããªããšããSetã®ç¹åŸŽãå©çšãããSetãé€å€ã§ããããã«ãªã£ãŠããããŸããRangeã«ã¯+ã¡ãœããããªãã®ã§ãšã©ãŒã«ãªãã irb(main):004 ã¯ãSetã«ã¯é çªããªããEnumeratorã¯å€éšã€ãã¬ãŒã¿ãªã®ã§æåŸã®èŠçŽ ãç¹å®ã§ããªããšããç¹åŸŽãå©çšããŠããã å®è¡çµæãèŠãã®ãäžçªæ©ãã§ããã éžæè¢1 irb(main): 001 > foo = 1 .. 3 => 1 .. 3 irb(main): 002 > foo.include?( 3 / 2 ) => true irb(main): 003 > (foo + [ 3 ]).inject( :+ ) (irb): 3:in ` <main>': undefined method ` + ' for an instance of Range (NoMethodError) irb(main):004> foo.last => 3 Rangeã«ã¯+ã¡ãœããããªãã®ã§NoMethodErrorã«ãªãã®ãšãlastã¡ãœãããããã®ã§çµæãè¿ã£ãŠããŸãã éžæè¢2 irb(main): 001 > foo = [ 1 , 2 , 3 ] => [ 1 , 2 , 3 ] irb(main): 002 > foo.include?( 3 / 2 ) => true irb(main): 003 > (foo + [ 3 ]).inject( :+ ) => 9 irb(main): 004 > foo.last => 3 lastã¡ãœãããããã®ã§çµæãè¿ã£ãŠããŸãã éžæè¢3 irb(main): 001 > foo = Set .new([ 1 , 2 , 3 ]) => #<Set: {1, 2, 3}> irb(main): 002 > foo.include?( 3 / 2 ) => true irb(main): 003 > (foo + [ 3 ]).inject( :+ ) => 6 irb(main): 004 > foo.last (irb): 4:in ` <main>': undefined method ` last ' for an instance of Set (NoMethodError) åãå€ã¯éè€ããªããšããSetã®ç¹åŸŽãã 003 ã®çµæã6ã«ãªããŸãã éžæè¢4 irb(main): 001 > foo = Enumerator .new { |y| [ 1 , 2 , 3 ].each { |i| y << i } } => #<Enumerator: ...> irb(main): 002 > foo.include?( 3 / 2 ) => true irb(main): 003 > (foo + [ 3 ]).inject( :+ ) => 9 irb(main): 004 > foo.last (irb): 4:in ` <main>': undefined method ` last ' for an instance of Enumerator (NoMethodError) æ£è§£ã§ããïŒïŒ æèè
ã®æ¹ã«è§£èª¬ã¢ãã Setã«ã¯é çªããªã ãšæžããŸããããfirstã¯ãããŸãããªã®ã§ããããªããŸãã irb(main): 001 > foo = Set .new([ 1 , 2 , 3 ]) => #<Set: {1, 2, 3}> irb(main): 002 > foo.first => 1 ãªãã§firstãããã®ãã詳ããæ¹ã®ã³ã¡ã³ããåŸ
ã£ãŠããŸããEnumerableãç¶æ¿ããŠãããããšèšãããããããŸã§ãšèšãã°ãããŸã§ã§ããïœ äžæ¥ç® - æ£ããåºåçµæã¯ïŒ åé¡ æ¬¡ã®ã³ãŒããå®è¡ããåºåçµæã§æ£ããã®ã¯ã©ãã§ãããïŒ (æåã³ãŒã UTF-8ãRuby: 3.3.0ã§å®è¡ããå Žå) hoge = [ ?1 , ?2 ].zip([ ?3 , ?4 ], [ ?5 , ?6 ]).transpose.flatten hoge.reject! hoge = hoge.map{|n| n.ord}.sort puts hoge.join( " , " ) éžæè¢ 1, 2, 3, 4, 5, 6 6, 5, 4, 3, 2, 1 49, 50, 51, 52, 53, 54 54, 53, 52, 51, 50, 49 æ£è§£ãšåçç æ£è§£ â
3. 49, 50, 51, 52, 53, 54 åçç 17.19ïŒ
14.06ïŒ
60.94ïŒ
7.81ïŒ
ã解説 å顿ã®ã³ãŒããèªã¿ã«ããããããããããšã€ã³ãã³ããã¹ããŒã¹ãå
¥ããŠããªãããšããã¡ãã£ãšã€ãžã¯ã«ãããŸããã [Integer, Integer]ã«å¯ŸããŠããªã«ããã倿ããã®ã¯ã²ã£ããããã€ã³ããå°ãªãã®ã§ãStringâIntegerãžå€æããããã«ããŠãè€éããå¢ãããã«ããŠããŸãã # zipã¡ãœããã䜿ã人ã¯ããŸãããªãããªã®ã§ãæ¡çš > hoge = [?1,?2].zip([?3,?4],[?5,?6]) => [["1", "3", "5"], ["2", "4", "6"]] # ããŒãã«ãªRubyistã¯2次å
é
åãæ±ãããšãå°ãªãã¯ããªã®ã§ãtransposeã¡ãœãããæ¡çš irb(main):003> hoge = hoge.transpose => [["1", "2"], ["3", "4"], ["5", "6"]] # Rubyistã¯flattenãçµæ§äœ¿ã£ãŠããæ°ããããããã¯é
åãå
¥ãåã«ããããªããããæ¡çš irb(main):004> hoge = hoge.flatten => ["1", "2", "3", "4", "5", "6"] # ãªã«ããã£ãŠãããã ãã©ãEnumeratorã«å€ããŠããã ã irb(main):006> hoge = hoge.reject! => #<Enumerator: ...> # ordã¡ãœããããStringããIntegerãžå€æããããšãç¥ã£ãŠããããã§ã㯠# sortã¡ãœãããéé or æé ã©ã¡ãã§äžŠã³æ¿ããŠããã詊ã irb(main):007> hoge = hoge.map{|n|n.ord}.sort => [49, 50, 51, 52, 53, 54] irb(main):008> puts hoge.join(", ") 49, 50, 51, 52, 53, 54 ãããã« 4/1 ããã¯ã€ãºäœæãéå§ããŠãçŽ4æ¥ã»ã©ã§ã»ãŒã»ãŒä»ã®åœ¢ãŸã§åºæ¥äžãããŸãããã©ãã§è²ããªæ¡ãåºããŠãç
®è©°ããŠããéçšããšãŠã楜ããã£ãïŒãããïŒã§ãã ãŸãã knuãããããŒã¹ã«éã³ã«æ¥ãŠãããŠPostããŠãããŠããã®ããšãŠãå¬ããã£ãã§ãïŒæ¥ãŠããã ããŠããããšãããããŸããïŒ Findyããã®åé¡è¯åã§ããïŒ èªåãSetãšEnumeratorãširbã»ãã·ã§ã³4è¡ç®ã®ç»å Žäººç©ãã¹ãŠã®äœè
ãªã®ã«ãè¶³ãç®ãåéãããŠèª€çããŠããŸã£ãïœ #RubyKaigi pic.twitter.com/qkXyemZZkn — Akinori Musha (@knu) 2024幎5æ16æ¥ åé¡ã¯ @hamchance0215 ã @aiandrox ã @sontixyou ãäœæããŠãããŸããïŒããããšãããããŸããïŒ 5/28ã«ã¯ãAfter RubyKaigi 2024ãã¡ããã¢ãZOZOãFindyãããšããŠãã¡ããã¢æ ªåŒäŒç€Ÿãæ ªåŒäŒç€ŸZOZOããã¡ã€ã³ãã£æ ªåŒäŒç€Ÿã®3瀟ã§RubyKaigi 2024ã®æ¯ãè¿ããè¡ããŸãã LTãããã«ãã£ã¹ã«ãã·ã§ã³ãªã©ã³ã³ãã³ãçãã ããããªã®ã§ãã²ãåå ãã ããïŒïŒ findy.connpass.com ãã¡ã€ã³ãã£ã§ã¯ããããããRubyãç©æ¥µçã«æŽ»çšããŠãRubyãšãšãã«æé·ããŠãããã°ãšèããŠãããŸãã ãããŠãäžç·ã«åãã¡ã³ããŒãçµ¶è³åéäžã§ãã èå³ãããæ¹ã¯ãã¡ããã â herp.careers