Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
30 ways for "Hello, world!" in Ruby
Search
Masafumi Okura
February 25, 2023
Programming
0
560
30 ways for "Hello, world!" in Ruby
A lightning talk for
https://30.ruby.or.jp/
Masafumi Okura
February 25, 2023
Tweet
Share
More Decks by Masafumi Okura
See All by Masafumi Okura
Why doesn't Ruby have Boolean class - final version
okuramasafumi
0
340
Reading Rails 1.0 Source Code
okuramasafumi
0
310
RDoc meets YARD
okuramasafumi
4
190
Why doesn't Ruby have Boolean class?
okuramasafumi
0
27
My KaigiEffect at RubyKaigi 2025, part 1
okuramasafumi
1
70
Writing documentation can be fun with plugin system
okuramasafumi
0
220
Alba: Why, How and What's So Interesting
okuramasafumi
0
430
Why did my proposals get rejected?
okuramasafumi
1
770
A suggestion for the future of RDoc
okuramasafumi
1
490
Other Decks in Programming
See All in Programming
イベントストーミングのはじめかた / Getting Started with Event Storming
nrslib
1
580
乱雑なコードの整理から学ぶ設計の初歩
masuda220
PRO
31
13k
Swift Concurrency 年表クイズ
omochi
3
230
What’s Fair is FAIR: A Decentralised Future for WordPress Distribution
rmccue
0
180
CSC509 Lecture 10
javiergs
PRO
0
180
Chart.jsで長い項目を表示するときのハマりどころ
yumechi
0
110
開発生産性が組織文化になるまでの軌跡
tonegawa07
0
170
目的で駆動する、AI時代のアーキテクチャ設計 / purpose-driven-architecture
minodriven
6
1.3k
「正規表現をつくる」をつくる / make "make regex"
makenowjust
1
470
予防に勝る防御なし(2025年版) - 堅牢なコードを導く様々な設計のヒント / Growing Reliable Code PHP Conference Fukuoka 2025
twada
PRO
39
12k
TVerのWeb内製化 - 開発スピードと品質を両立させるまでの道のり
techtver
PRO
3
1.1k
Verilator + Rust + gRPC と Efinix の RISC-V でAIアクセラレータをAIで作ってる話 RTLを語る会(18) 2025/11/08
ryuz88
0
360
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.3k
How to Think Like a Performance Engineer
csswizardry
28
2.3k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
How GitHub (no longer) Works
holman
315
140k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Producing Creativity
orderedlist
PRO
348
40k
How STYLIGHT went responsive
nonsquared
100
5.9k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
320
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Transcript
Ruby30 Ruby でハローワールドする30 の方法
i = 30 "#{i} 周年おめでとうございます " + ? ! *
i
30 周年ということで、 Ruby でハローワ ールドする 30 の方法を紹介します
レギュレーション: "Hello, world!" を 改行込みで出力する 警告やエラーを出さない
Ruby で Hello world する方法その 1 # 一番単純 puts "Hello,
world!"
Ruby で Hello world する方法その 2 # 文字列埋め込み hello =
"Hello" world = 'world!' puts "#{hello}, #{world}"
Ruby で Hello world する方法その 3 # フォーマット文字列、`ord` で得られた数字を使う printf
"%s, %c%c%c%c%c%c%c", "Hello", 119, 111, 114, 108, 100, 33, 10
Ruby で Hello world する方法その 4 # 標準出力($> )に文字列を追加する $><<"Hello,
world!\n"
Ruby で Hello world する方法その 5 # 正規表現でキャプチャして連結 str =
"Hello, ruby30 world!" md = str.match /^(\w+).+(\w{5,}!)/ puts md.captures.join(', ')
Ruby で Hello world する方法その 6 # シンボルのリテラルにもいくつか書き方がある print %s|Hello,
world| puts :!
Ruby で Hello world する方法その 7 # Ruby には「文字」リテラルがあるのでそれらを結合する puts
?H << ?e << ?l << ?l << ?o << ?, << ?\u0020 << ?w << ?o << ?r << ?l << ?d << ?!
Ruby で Hello world する方法その 8 # ヒアドキュメントで縦書きを実現 puts <<"HELLOWORLD".chomp.gsub(/([a-zA-Z,
])?\n/) {|match| match[0]} H e l l o , \x20 w o r l d ! HELLOWORLD
Ruby で Hello world する方法その 9 # 文字列の生成方法は色々ある puts %q(Hello)
+ String.new(', ') + String(:world!)
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
Ruby で Hello world する方法その 11 # eval するだけだが、よく見るとネストしている eval("eval
%q(puts 'Hello, world!')")
Ruby で Hello world する方法その 12 # eval の仲間のinstance_eval を使う、self
はHello, world! "Hello, world!".instance_eval do puts self end
Ruby で Hello world する方法その 13 # then とmethod メソッドのProc
化を組み合わせる "Hello, world!".then(&method(:puts))
Ruby で Hello world する方法その 14 # p はinspect を内部で呼ぶので、inspect
が文字列を返せばよい str = "" def str.inspect "Hello, world!" end p str
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
Ruby で Hello world する方法その 16 # 全てのputs がHello, world!
になる module HelloWorld def puts(*args) super("Hello, world!") end end Kernel.prepend(HelloWorld) puts
Ruby で Hello world する方法その 17 # 素直に新しいメソッドを定義する module HelloWorld
def put_hello_world puts("Hello, world!") end end Kernel.include(HelloWorld) put_hello_world
Ruby で Hello world する方法その 18 # String をオープンクラスする class
String def print_self puts self end end "Hello, world!".print_self
Ruby で Hello world する方法その 19 # オープンクラスはお行儀が悪いのでrefinements を使う using
Module.new { refine String do def print_self puts self end end } "Hello, world!".print_self
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
Ruby で Hello world する方法その 21 # 文字列は隣接させると連結される # %
リテラルの区切り文字には空白が使える # Thanks @tompng puts(% Hello, ' world'"!")
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
Ruby で Hello world する方法その 23 # puts はKernel のインスタンスメソッドなので、適当なオブジェクトにbind
できる Kernel.instance_method(:puts).bind(Object.new).call("Hello, world!")
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!")
Ruby で Hello world する方法その 25 # クラス名は文字列の代わりになる class Hello
end class World def self.to_s = 'world!' end print "#{Hello}, #{World}\n"
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!
Ruby で Hello world する方法その 27 # exit してもハローワールドはできる at_exit
{ puts "world!" } print "Hello, " exit
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 }
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
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 "!"
ご清聴ありがとうございました