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
550
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
330
Reading Rails 1.0 Source Code
okuramasafumi
0
300
RDoc meets YARD
okuramasafumi
4
180
Why doesn't Ruby have Boolean class?
okuramasafumi
0
24
My KaigiEffect at RubyKaigi 2025, part 1
okuramasafumi
1
58
Writing documentation can be fun with plugin system
okuramasafumi
0
210
Alba: Why, How and What's So Interesting
okuramasafumi
0
420
Why did my proposals get rejected?
okuramasafumi
1
750
A suggestion for the future of RDoc
okuramasafumi
1
430
Other Decks in Programming
See All in Programming
Advance Your Career with Open Source
ivargrimstad
0
540
登壇は dynamic! な営みである / speech is dynamic
da1chi
0
340
Railsだからできる 例外業務に禍根を残さない 設定設計パターン
ei_ei_eiichi
0
870
Domain-centric? Why Hexagonal, Onion, and Clean Architecture Are Answers to the Wrong Question
olivergierke
2
860
バッチ処理を「状態の記録」から「事実の記録」へ
panda728
PRO
0
160
あなたとKaigi on Rails / Kaigi on Rails + You
shimoju
0
160
PHPに関数型の魂を宿す〜PHP 8.5 で実現する堅牢なコードとは〜 #phpcon_hiroshima / phpcon-hiroshima-2025
shogogg
1
220
「ちょっと古いから」って避けてた技術書、今だからこそ読もう
mottyzzz
10
6.7k
AIと人間の共創開発!OSSで試行錯誤した開発スタイル
mae616
1
250
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
1
450
Devoxx BE - Local Development in the AI Era
kdubois
0
130
CSC305 Lecture 03
javiergs
PRO
0
240
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
238
140k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
30
2.9k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Making Projects Easy
brettharned
120
6.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
33
2.3k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
13k
Site-Speed That Sticks
csswizardry
12
900
Designing for humans not robots
tammielis
254
26k
Building Better People: How to give real-time feedback that sticks.
wjessup
369
20k
Statistics for Hackers
jakevdp
799
220k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
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 "!"
ご清聴ありがとうございました