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

30 ways for "Hello, world!" in Ruby

30 ways for "Hello, world!" in Ruby

A lightning talk for https://30.ruby.or.jp/

Masafumi Okura

February 25, 2023
Tweet

More Decks by Masafumi Okura

Other Decks in Programming

Transcript

  1. Ruby で Hello world する方法その 2 # 文字列埋め込み hello =

    "Hello" world = 'world!' puts "#{hello}, #{world}"
  2. Ruby で Hello world する方法その 5 # 正規表現でキャプチャして連結 str =

    "Hello, ruby30 world!" md = str.match /^(\w+).+(\w{5,}!)/ puts md.captures.join(', ')
  3. Ruby で Hello world する方法その 7 # Ruby には「文字」リテラルがあるのでそれらを結合する puts

    ?H << ?e << ?l << ?l << ?o << ?, << ?\u0020 << ?w << ?o << ?r << ?l << ?d << ?!
  4. Ruby で Hello world する方法その 10 # "Hello, world!".each_codepoint.map{|n| n.to_s(16)

    } # で得られたコードポイントの配列を文字列に戻す ["48", "65", "6c", "6c", "6f", "2c", "20", "77", "6f", "72", "6c", "64", "21", "a"].each do |codepoint| print codepoint.to_i(16).chr end
  5. Ruby で Hello world する方法その 12 # eval の仲間のinstance_eval を使う、self

    はHello, world! "Hello, world!".instance_eval do puts self end
  6. Ruby で Hello world する方法その 13 # then とmethod メソッドのProc

    化を組み合わせる "Hello, world!".then(&method(:puts))
  7. Ruby で Hello world する方法その 14 # p はinspect を内部で呼ぶので、inspect

    が文字列を返せばよい str = "" def str.inspect "Hello, world!" end p str
  8. Ruby で Hello world する方法その 15 # puts は内部でto_s を呼ぶので、to_s

    がHello, world! を返せばよい class Okura def name = "OKURA Masafumi" def work_as = "Freelancer" def available_for_hiring? = true def organizer_of = "Kaigi on Rails" def to_s "Hello, world!" end end puts Okura.new
  9. Ruby で Hello world する方法その 16 # 全てのputs がHello, world!

    になる module HelloWorld def puts(*args) super("Hello, world!") end end Kernel.prepend(HelloWorld) puts
  10. Ruby で Hello world する方法その 17 # 素直に新しいメソッドを定義する module HelloWorld

    def put_hello_world puts("Hello, world!") end end Kernel.include(HelloWorld) put_hello_world
  11. Ruby で Hello world する方法その 18 # String をオープンクラスする class

    String def print_self puts self end end "Hello, world!".print_self
  12. Ruby で Hello world する方法その 19 # オープンクラスはお行儀が悪いのでrefinements を使う using

    Module.new { refine String do def print_self puts self end end } "Hello, world!".print_self
  13. Ruby で Hello world する方法その 20 # メソッドチェーンは便利 class String

    ("a".."z").each do |char| define_method(char) { self + char } end def comma = self + ?, def space = self + ' ' def ! = self + ?! def puts = Kernel.puts(self) end "H".e.l.l.o.comma.space.w.o.r.l.d.!.puts
  14. Ruby で Hello world する方法その 21 # 文字列は隣接させると連結される # %

    リテラルの区切り文字には空白が使える # Thanks @tompng puts(% Hello, ' world'"!")
  15. Ruby で Hello world する方法その 22 # 無意味なオブジェクト指向 class Printer

    def initialize(object) @object = object end def print Kernel.print @object puts end end Printer.new("Hello, world!").print
  16. Ruby で Hello world する方法その 24 # どうしてこうなるのかわからない # Dummy

    クラスは警告抑制に必要、say メソッドはないとSyntaxError class Dummy def method_missing(meth, *args, &blk) puts meth end def self.const_missing(name) print name.to_s + ', ' end def say(*) end end Dummy.new.instance_eval("say Hello, world!")
  17. Ruby で Hello world する方法その 25 # クラス名は文字列の代わりになる class Hello

    end class World def self.to_s = 'world!' end print "#{Hello}, #{World}\n"
  18. Ruby で Hello world する方法その 26 # world! の返り値を、world! の中で定義したhello

    メソッドで利用する def world! def hello(str) puts "#{__method__.to_s.capitalize}, #{str}" end __method__.to_s end hello world!
  19. Ruby で Hello world する方法その 28 # 文字列をバラしてから復元する ORDER =

    { "H": [1], "e": [2], "l": [3, 4, 11], "o": [5, 9], ",": [6], " ": [7], "w": [8], "r": [10], "d": [12], "!": [13] } puts "Hello, world!".chars.shuffle.each_with_object("a"*13) { |char, result| index = ORDER[char.to_sym] result[index.shift - 1] = char }
  20. Ruby で Hello world する方法その 29 # 変数名を使う、大文字や空白、! は使えないので工夫が必要 hello

    = nil world = nil binding.local_variables.each_with_index do |var, i| i.zero? ? (print var.capitalize) : (puts ", #{var}!") end
  21. Ruby で Hello world する方法その 30 # Fiber で記号に関して処理を中断して、記号を入れたら再開する f

    = Fiber.new do "Helloworld".each_char.with_index do |c, idx| print c Fiber.yield if idx == 4 || idx == 10 end end f.resume print ", " f.resume puts "!"