Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
30 ways for "Hello, world!" in Ruby
Search
Masafumi Okura
February 25, 2023
Programming
700
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
30 ways for "Hello, world!" in Ruby
A lightning talk for
https://30.ruby.or.jp/
Masafumi Okura
February 25, 2023
More Decks by Masafumi Okura
See All by Masafumi Okura
Ruby for complete beginners
okuramasafumi
1
280
Conference as a communication hub for all of us
okuramasafumi
0
180
Metaprogramming isn't real, it can't hurt you
okuramasafumi
0
190
Developing static sites with Ruby
okuramasafumi
1
480
Why doesn't Ruby have Boolean class - final version
okuramasafumi
0
440
Reading Rails 1.0 Source Code
okuramasafumi
0
400
RDoc meets YARD
okuramasafumi
4
300
Why doesn't Ruby have Boolean class?
okuramasafumi
0
88
My KaigiEffect at RubyKaigi 2025, part 1
okuramasafumi
1
120
Other Decks in Programming
See All in Programming
JRuby: Past, Present, and Future
headius
0
220
setup-vp GitLab対応の裏側
naokihaba
0
150
Verilogで学ぶCPU自作入門
uyuki234
8
4k
Embedded Swiftで作る自作USBデバイス によるiOSデバイスの自動テスト / iOSDC Japan 2026 glassfiber
glassfiber
0
310
Workers Cache を知る
syumai
0
340
残高管理から台帳サービスへの進化
artoy
0
170
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
470
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
160
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.5k
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
34
15k
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.9k
Featured
See All Featured
Skip the Path - Find Your Career Trail
mkilby
1
240
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Product Roadmaps are Hard
iamctodd
55
13k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
450
Building Applications with DynamoDB
mza
96
7.2k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
450
Building Flexible Design Systems
yeseniaperezcruz
330
41k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
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 "!"
ご清聴ありがとうございました