Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby (MRI) の好きなところ 30

Ruby (MRI) の好きなところ 30

プログラミング言語Ruby30周年記念イベント LT
#ruby30th

More Decks by Misaki Shioi(塩井美咲/しおい)

Other Decks in Programming

Transcript

  1. ԘҪඒ࡙ [email protected]

    'FC
    ϓϩάϥϛϯάݴޠ3VCZप೥ه೦Πϕϯτ
    3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ

    View Slide

  2. aaॕ3VCZप೥

    View Slide

  3. ͓ॕ͍ͷؾ࣋ͪΛͿ͚ͭΔ΂͘ɺ
    3VCZ .3*
    ͷݸਓతʹ޷͖ͳͱ͜ΖΛ
    प೥ʹ͔͚ͭͯ͜
    ݸ͝঺հ͠ʹ͖·ͨ͠

    View Slide

  4. ͝ཡͷօ͞Μ΋ͥͻ͝Ұॹʹ
    3VCZͷ޷͖ͳͱ͜ΖΛ
    ݸߟ͑ͯΈ͍ͯͩ͘͞

    View Slide

  5. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ

    View Slide

  6. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    "QSPHSBNNFS`TCFTUGSJFOE
    ɹɹɹ࣮ݱ͍ͨ͜͠ͱΛ্ख͍͜ͱදݱͰ͖ΔΑ͏ʹ
    ɹɹɹͳΔ·Ͱ෇͖߹ͬͯ͘ΕΔ
    ɹɹɹଞͷ༑ୡΛ঺հͯ͘͠ΕͨΓ΋͢Δ
    IUUQTXXXSVCZMBOHPSHKB
    ˞ΧϯϑΝϨϯεɺςοΫΠϕϯτɺίϛϡχςΟͷϛʔτΞοϓ

    View Slide

  7. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ໊લ
    ɹɹɹʮ3VCZʯ୹͍ɺՄѪ͍ɺ֮͑΍͍͢
    ɹɹɹʜ͠ɺ
    ɹɹɹ3VCZࣗ਎ͷதͰ΋໊લ͕େࣄʹ͞Ε͍ͯΔͱ͜Ζ
    ɹɹɹ ػೳ໊ɺϝιου໊ɺจԽFUDʜ

    View Slide

  8. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ಉ͜͡ͱΛ͢ΔͨΊʹ
    ͍ΖΜͳํ๏͕༻ҙ͞Ε͍ͯͯ
    ଟ༷ੑ͕େࣄʹ͞Ε͍ͯΔͱ͜Ζ
    class Foo

    def foo

    puts "#ruby30th"

    end

    end

    Foo.new.foo # => #ruby30th

    Bar = Class.new do

    de
    fi
    ne_method(:bar) do

    stdout = IO.new(2)

    stdout.send(:write, “#ruby30th\n”)

    end

    end

    Bar.new.bar # => #ruby30th

    View Slide

  9. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ͳΜͰ΋ΦϒδΣΫτ
    ɹɹɹԿʹͰ΋ϝοηʔδΛૹΔ͜ͱ͕Ͱ͖Δͱ͜Ζ
    Class.new

    Module.new

    Exception.new

    Errno::ESHUTDOWN.new

    self.binding

    self.method(:__method__)

    self.method(:__method__).unbind

    TracePoint.new(:call) { |tp| tp.event }
    Ϋϥε΋
    Ϟδϡʔϧ΋
    ྫ֎΋
    γεςϜΤϥʔ΋
    ؀ڥ৘ใ΋
    ϝιου΋
    Ϩγʔόͷͳ͍ϝιου΋
    τϨʔεϙΠϯτ΋FUDʜ

    View Slide

  10. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ

    ɹɹɹͷΑ͏ͳ༡ͼ৺Λ͙͘͢Δϝιου͕๛෋ͳͱ͜Ζ
    ɹɹɹ͢΂͕ͯఝʹݟ͑ΔΑ͏ʹͳΔ
    BasicObject#method_missing FUDʜ

    class Foo

    def method_missing(name, *_args, &_block)

    puts "##{name}"

    end

    end

    Foo.new.ruby30th # => #ruby30th

    View Slide

  11. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    େମࣜ
    ɹɹɹͳͷͰ͜Μͳ͜ͱ͕Ͱ͖Δͱ͜Ζ
    ɹɹɹ͜Εͬͯ͘͢͝ͳ͍Ͱ͔͢
    message = if ruby.birthday?

    “#ruby30th”

    else

    “Anyway I love Ruby everyday”

    end

    puts message # => #ruby30th

    View Slide

  12. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ͋ΒΏΔߏจ͕ׅހͰғΉͱࣜ
    ɹɹɹͳͷͰ͜Μͳ͜ͱ͕Ͱ͖Δͱ͜Ζ
    ɹɹɹ
    message = (() || (def foo = “#ruby30th”); foo)

    puts message # => #ruby30th

    View Slide

  13. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    Ҿ਺͕͘͢͝ॊೈ
    ɹɹɹͳͷͰ͜Μͳ͜ͱ͕Ͱ͖Δͱ͜Ζ
    ɹɹɹ
    def foo(arg = true ? “#ruby30th” : “Anyway I love Ruby everyday”)

    puts arg # => #ruby30th

    end

    def bar(arg: def m; “#ruby30th”; end)

    puts arg # => :m

    puts self.method(arg).call # => #ruby30th

    end

    View Slide

  14. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ϒϩοΫͷଘࡏ͸͔ܽͤͳ͍
    ɹɹɹϒϩοΫ͕ࣗ෼ͷߟ͑ํΛॊೈʹͯ͘͠ΕΔͱ͜Ζ
    i, chars = 0, %(# r u b y 3 0 t h)

    def foo(chars, &block)

    yield chars

    foo(&block)

    end

    foo(chars) { |chars| print chars[i]; i += 1; break if i >= chars.length }

    puts “\n” # => #ruby30th

    View Slide

  15. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ

    ɹɹɹϒϩοΫͷ͜͜ͷ͓͔͛Ͱ
    ɹɹɹॲཧΛऴྃ͠๨ΕͣʹࡁΉͱ͜Ζ
    ɹɹɹ
    File.open { |f| … } Thread.open { |t| … } ͱ͔
    ͱ͔
    ͜͜ ͜͜

    View Slide

  16. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ྫ֎ॲཧ
    ɹɹɹػೳ΋ἧ͍ͬͯΔ͠௚ײతͰ໎ࢠʹͳΒͳ͍ͱ͜Ζ
    def foo

    raise LightningTalkTimeout if Time.now > lightning_talk_started_at + 300

    rescue

    puts “OMG”

    else

    puts “Yaaaaay”

    ensure

    puts “Anyway, #ruby30th”

    end

    View Slide

  17. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ

    ɹɹɹศར
    ɹɹɹ͜Μͳ͜ͱ΋Ͱ͖Δ
    (“Perl”..“Smalltalk”).cover? “Ruby" # => true

    (“Perl”..“Python”).cover? “Ruby" # => false
    1..30 ൣғϦςϥϧ

    1…30

    View Slide

  18. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ਺஋ʹ۠੾Γจࣈ͕ೖΕΒΕΔ
    ɹɹɹɹ
    ɹɹɹͷͰ໨ʹ༏͍͠
    “LT͸ը໘੾Γସ͑ͷ࣌ؒࠐΈͰ #{5} ෼Ͱ͢ʂ”

    “LT͸ը໘੾Γସ͑ͷ࣌ؒࠐΈͰ #{300} ඵͰ͢ʂ”

    “LT͸ը໘੾Γସ͑ͷ࣌ؒࠐΈͰ #{300_000} ϛϦඵͰ͢ʂ”

    “LT͸ը໘੾Γସ͑ͷ࣌ؒࠐΈͰ #{300_000_000} ϚΠΫϩඵͰ͢ʂ”

    “LT͸ը໘੾Γସ͑ͷ࣌ؒࠐΈͰ #{300_000_000_000} φϊඵͰ͢ʂ”
    IUUQTUXJUUFSDPNSVCZUITUBUVT T

    View Slide

  19. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ɹɹɹ
    ɹɹɹ
    ɹɹɹ͜ΕҰൃͰ5$1αʔόʔϓϩηε͕Ͱ͖ͯ͠·͏
    ɹɹɹ͜ͷϝιουʹݶΒ্ͣख͍͜ͱ΍ͬͯ͘ΕΔ
    ɹɹɹศརϝιου͕ͨ͘͞Μ༻ҙ͞Ε͍ͯΔͱ͜Ζ
    require “socket”

    Socket.tcp_server_loop(12345) do |sock|

    sock.puts(“#ruby30th”)

    sock.close

    end
    Socket.tcp_server_loop

    View Slide

  20. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ૊ΈࠐΈϥΠϒϥϦ͚ͩͰͳ͘
    ඪ४ఴ෇ͷϥΠϒϥϦ܈͕͓ͦΖ͘͠
    ॆ࣮͍ͯ͠Δͱ͜Ζ
    ɹɹɹ
    ɹɹɹ
    ΔΓ·ͷϥΠϒϥϦҰཡϖʔδͷϑϧεΫϦʔϯγϣοτΛࡱΔ΋
    શવεϥΠυʹऩ·Βͳ͔ͬͨͷͰԣʹฒ΂ͨͷਤˣ

    View Slide

  21. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ϥΠϒϥϦͱ͍͑͹
    3VCZ(FNTͱ#VOEMFSͷଘࡏ͸Ғେ
    ɹɹɹ
    ɹɹɹ๛෋ͳϥΠϒϥϦʹࠓ͙͢ΞΫηεͰ͖ͯ
    ɹɹɹґଘؔ܎ʹ೰Ή͜ͱͳ͘࢖͑Δͱ͜Ζ
    ɹɹɹ͍ͭ΋͓ੈ࿩ʹͳ͍ͬͯ·͢

    View Slide

  22. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ΤίγεςϜʹݴٴ࢝͠ΊΔͱແݶʹ
    ޿͕Γͦ͏ͳͷͰ૊ΈࠐΈϥΠϒϥϦʹ࿩Λ
    ໭͢ͱɺ04ͷίϚϯυ΍γεςϜίʔϧ͕
    3VCZϨϕϧͰѻ͑Δͱ͜Ζ΋͏Ε͍͠
    reader, writer = IO.pipe

    pid = fork { writer.puts “#ruby30th" }

    Process.waitpid(pid)

    exec("echo", “-n", reader.gets) # => #ruby30th

    View Slide

  23. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ͜͜·Ͱ3VCZ͕ίʔυΛॻͨ͘Ίͷ
    αϙʔτΛͯ͘͠Ε͍ͯΔͱɺ
    ॻ͍͍ͯΔ͏ͪʹίʔυͷؾ͕࣋ͪ
    Θ͔ͬͯ͘ΔΑ͏ͳࡨ֮ΛಘΒΕΔ
    ɹɹɹʮ͜ͷίʔυ͸͜͏͍͏෩ʹॻ͍ͯཉ͍͠ͷͰ͸ ʯ

    View Slide

  24. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    3VCZࣗ਎΋
    զʑϓϩάϥϚʹରͯ͠Φʔϓϯ
    ɹ ಺෦৘ใ΁ͷ"1*͕ఏڙ͞Ε͍ͯΔ

    ɹɹɹ
    $ ruby -e "pp RubyVM::AbstractSyntaxTree.parse('puts 1 + 2')"

    ([email protected]:0-1:10

    tbl: []

    args: nil

    body: ([email protected]:0-1:10 :puts

    ([email protected]:5-1:10 ([email protected]:5-1:10 ([email protected]:5-1:6 1) :+ ([email protected]:9-1:10 ([email protected]:9-1:10 2) nil)) nil)))

    $ ruby -e "puts RubyVM::InstructionSequence.compile('puts 1 + 2').disasm"

    == disasm: #@:1 (1,0)-(1,10)> (catch: false)

    0000 putself ( 1)[Li]

    0001 putobject_INT2FIX_1_

    0002 putobject 2

    0004 opt_plus [CcCr]

    0006 opt_send_without_block

    0008 leave

    View Slide

  25. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    HFNͷڍಈΛௐ΂ΔͨΊʹ
    HFNͷιʔείʔυΛมߋͨ͠ޙɺ
    ࠶ίϯύΠϧͤͣʹ
    ࣮ߦͰ͖Δͱ͜Ζ
    ɹɹɹศར

    View Slide

  26. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    JSC
    ɹɹɹଘࡏͦͷ΋ͷ͕ଚ͍
    ɹɹɹͦͷ্γϯλοΫεϋΠϥΠτʹิ׬·Ͱʜ

    View Slide

  27. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ίϚϯυʹΦϓγϣϯΛ౉͢ͱ
    ύʔαͷঢ়ଶมԽ͕֬ೝͰ͖ͯ֨޷͍͍
    ruby -y
    ʜ

    View Slide

  28. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ॊೈͳจ๏Λ׎͑ΔͨΊʹ
    ߏจنଇ͕ݸɺ
    ύʔαͷঢ়ଶ͕ݸ΋
    ఆٛ͞Ε͍͍ͯͯ͢͝
    ˞3VCZ࣌఺͓͍͠ௐ΂

    View Slide

  29. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ͦΕΛ࣮ݱ͢Δ
    QBSTFZ͸ਆ͕͔Γతॴۀ

    View Slide

  30. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ͦΕΛ۩ݱԽ͢Δ
    DPNQJMFD΋ਆ͕͔Γతॴۀ

    View Slide

  31. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    JOTOTEFGʹ
    ʮੜ໋ɺӉ஦ɺͦͯ͠ສ෺ʹ͍ͭͯͷڀۃͷٙ໰ͷ౴͑ʯ
    Ͱ͋ΔBOTXFS໋ྩ͕ఆٛ͞Ε͍ͯΔͷͰ
    3VCZ͸ԿͰ΋஌͍͍ͬͯͯ͢͝

    View Slide

  32. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ຖ೥ΫϦεϚεʹ
    ϦϦʔε͞ΕΔͱ͜Ζ
    ɹɹɹϓϨθϯτͬΆͯ͘ྑ͍
    ɹɹɹຖ೥͋Γ͕ͱ͏͍͟͝·͢
    IUUQTXXXSVCZMBOHPSHKB

    View Slide

  33. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ϑϦʔιϑτ΢ΣΞͳͱ͜Ζ
    ɹɹɹ.Z3VCZΛͭ͘Δ͜ͱ͕Ͱ͖Δ
    IUUQTXXXSVCZMBOHPSHFOBCPVUMJDFOTFUYU

    View Slide

  34. 3VCZ .3*
    ͷ޷͖ͳͱ͜Ζ
    ࠓ೔·Ͱ։ൃ͕ଓ͍͍ͯΔͱ͜Ζ
    ɹɹɹ৽͍͠ػೳ͕ͲΜͲΜ૿͍͑ͯΔ
    ɹɹɹݩʑ͋ͬͨػೳ΋ޙํޓ׵ੑʹ഑ྀͭͭ͠
    ɹɹɹͲΜͲΜվળ͞Ε͍ͯΔ

    View Slide

  35. 3VCZ .3*
    ͷ޷͖ͳͱ͜ΖBOENPSFʜ
    .BU[JTOJDF
    BOE
    TPXFBSFOJDF
    3VCZ,BJHJ%BZ)BMM"@@%4$

    View Slide

  36. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
    ɹɹ(JU)VC!TIJPJNN
    ɹɹ[email protected]
    ɹɹגࣜձࣾΤεɾΤϜɾΤε
    ɹɹ'VLVPLBSCग़਎"TBLVTBSCҭͪ
    a͓͍͕͓͠ૹΓ͠·ͨ͠

    View Slide