Rubyist Scala
2.0
in Kawasaki Ruby Kaigi
@Peranikov
• (Matsukubo Yuto)
• @Peranikov
• Kawasaki.rb 

http://kawasakirb.github.io/
• Ruby
• )Socket Ruby Scala
• We’re hiring!
T
Rubyist
Scala
Kawasaki.rb Ruby
Scala
?✋
Rubyist Scala
• Ruby 

Scala
• 

(Rubyist )
•
Scala
Scala
•
• JVM ( .NET )
• Java BetterJava
Ruby ?
Ruby ( )
•
•
• Mix-In
• Open Class
• method_missing
•
Ruby ( )
•
•
• Mix-In
• Open Class
• method_missing
•
Scala !
Ruby
1 + 2 # => 3
1.+(2) # => 3
Scala
1 + 2 // => 3
1.+(2) // => 3
Scala
class MyClass {
// ()
def smile: String = {
" :-)"
}
//
def smile(str: String): String = {
str + " :-)"
}
// {}
def smile2(str: String) = str + " :-)"
}
Scala
val obj = new MyClass
// ()
//
obj.smile
//
obj.smile("Hi,")
// 1 ()
obj smile "Hi,"
Ruby
• Enumerable#map(collect)
• Enumerable#flat_map
• Enumerable#reduce(inject)
• Enumerable#select
• Enumerable#find
• etc…
Scala
• Traversable#map
• Traversable#flatMap
• Traversable#reduceLeft
• Traversable#filter
• Traversable#find
• etc…
: Ruby map
[1, 2, 3, 4].map { |i| i * 2 }
# => [2, 4, 6, 8]
Scala
List(1, 2, 3, 4).map { i => i * 2 }
// => List(2, 4, 6, 8)
Ruby !
Scala ( )
List(1, 2, 3, 4).map { _ * 2 }
// => List(2, 4, 6, 8)
Q. ?
A. Ruby
• Scala map
List(1,2,3).map { i => i * 2 }
List(1,2,3).map( i => i * 2 )
Scala {}
Ruby lambda
# Ruby
f = lambda { |i| i + 10 }
f.call(20) # => 30
// Scala
val f = (i: Int) => i + 10
f(20) // => 30
:size or length?
• List
• size length (size length )
•
Ruby
List(1,2,3).length // => 3
List(1,2,3).size // => 3
Mix-In
Ruby module Mix-in
module Monster
def roar
' '
end
end
class Godzilla
include Monster
end
Godzilla.new.roar # => " "
Scala Trait
trait Monster {
def roar = " "
}
class Godzilla extends Monster
(new Godzilla).roar // => " "
trait Monster {
def roar = " "
}
trait HasTail {
def swing = " "
}
class Godzilla
extends Monster with HasTail
trait Monster {
def roar: String
}
class Godzilla extends Monster {
def roar = " "
}
(new Godzilla).roar // => " "
Open Class
Ruby Open Class
class String
def replace_to_scala
self.gsub('ruby', 'scala')
end
end
"ruby is nice!".replace_to_scala
# => "scala is nice!"
Scala Open Class( )
implicit class MyString(val s: String)
def replaceToScala = {
s.replaceAll("ruby", "scala")
}
}
"ruby is nice!".replaceToScala
// String = scala is nice!
implicit class MyString(val s: String)
def replaceToScala = {
s.replaceAll("ruby", "scala")
}
}
"ruby is nice!".replaceToScala
// String = scala is nice!
implicit conversion
•
•
def concat(i: String, j: String): String = {
i + j
}
implicit def intToString(src: Int): String = {
src.toString
}
concat(100, 200) // => 100200
method_missing
Ruby method_missing
class MyClass
def method_missing(name)
"#{name} is missing!!"
end
end
MyClass.new.foo
# => "foo is missing!!"
Scala method_missing
(Dynamic )
import scala.language.dynamics
class MyClass extends Dynamic {
def selectDynamic(name: String): String = {
s"${name} is missing!"
}
}
(new MyClass).foo // => foo is missing!
Duck Typing
Ruby Duck Typing
•
Scala Duck Typing

(Structural Subtyping)
•
•
• : roar
1.
type Roarabel = {
def roar: String
}
2.
class KingGhidorah {
def roar: String = " "
}
class Mothra {
def roar: String = " "
}
3.
def doRoar(target: Roarabel) = {
target.roar
}
doRoar(new KingGhidorah)
// => “ ”
doRoar(new Mothra)
// => “ ”
Scala
•
• Future
• Scala.js … JS Scala
• Scala Native … Scala LLVM
• Dotty … Scala
• Scala
• Ruby Scala
• Rubyist Scala !
Rubyistを誘うScalaの世界 2.0

Rubyistを誘うScalaの世界 2.0