rubyistを誘うscalaの世界 2.0

50
Rubyist Scala 2.0 in Kawasaki Ruby Kaigi @Peranikov

Upload: yuto-matsukubo

Post on 08-Jan-2017

1.178 views

Category:

Technology


0 download

TRANSCRIPT

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

Scalaclass MyClass { // ()

def smile: String = { " :-)" } //

def smile(str: String): String = { str + " :-)" }

// {}

def smile2(str: String) = str + " :-)"}

Scalaval 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# Rubyf = lambda { |i| i + 10 }f.call(20) # => 30

// Scalaval f = (i: Int) => i + 10f(20) // => 30

:size or length?• List

• size length (size length )

Ruby

List(1,2,3).length // => 3List(1,2,3).size // => 3

Mix-In

Ruby module Mix-inmodule Monster def roar ' '

endend

class Godzilla include Monsterend

Godzilla.new.roar # => " "

Scala Traittrait 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') endend

"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_missingclass MyClass def method_missing(name) "#{name} is missing!!" endend

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 !