Ruby Ruby VS Scala

michael_roshen · May 05, 2015 · Last by michael_roshen replied at May 06, 2015 · 6014 hits

Scala vs Ruby

1. no ; at the end of lines

2. base operate

scala:

val list = Array(1,2,3,4)  

list.filter( _ % 2 == 0)
list.filter{e: Int => (e % 2 == 0)}

ruby:

list = [1,2,3,4]
list.select{|x| x % 2 == 0}

3. staic types

scala:

import scala.collection.mutable.HashMap
var hash =new HashMap[Int, String]
hash += (1 -> "hello")
hash += (3) #error: type mismatch; 

ruby:

hash = Hash.new
hash = 3 #3

4. Dynamic calls

scala:

import scala.language.dynamics

class Animal extends Dynamic {
  def selectDynamic(name: String) {
    println("Animal wants to " + name)
  }

  def applyDynamic(name: String)(args: Any*) {
    println("Animal wants to " + name + args.mkString(","))
  }
}

scala> var a = new Animal
scala> a.say
Animal wants to say
scala> a.say("hello")
Animal wants to say hello

ruby:

class Animal
  def method_missing name,*args
    if args.empty?
      puts "Animal says " + name.to_s
    else
      puts "Animal wants to " + name.to_s + args.join(",")
    end
    self
  end
end

2.2.1 :020 > animal = Animal.new
2.2.1 :020 > animal.qualk
Animal says qualk
2.2.1 :021 > animal.say("hello")
Animal wants to say hello

5. minxin

scala:

trait MyClass {
  def my_method = println("my method")
}
class IncludeTrait extends MyClass
scala> (new IncludeTrait).my_method
my method

ruby:

module MyModule
  def my_method
    puts "my_method"
  end
end

class IncludeModule
  include MyModule
end

2.2.1 :032 >IncludeModule.new.my_method
my_method

6. duck type

scala:

class Duck{
  def quack = { println("duck quack..")}
  def walk = { println("duck walk..")}
}


class Platypus{
  def quack = { println("platypus quack..")}
  def walk = { println("platypus walk..")}
}

def ActAsADuck(a: {def quack; def walk}) = {
  a.quack
  a.walk
}

val duck  = new Duck
val paltypus = new Platypus
ActAsADuck(duck)
ActAsADuck(platypus)

ruby:

class Duck
  def quack; end
  def walk; end
end

class Platypus
  def quack; end
  def walk; end
end

def act_as_a_duck(animal)
  animal.quack
  animal.walk
end

duck = Duck.new
platypus = Platypus.new

act_as_a_duck(duck)
act_as_a_duck(platypus)

7. unit test

scala:

@Test def myTest(){
  val array = List(1,2,3)
  assert(array(0) === 1)
}

ruby:

test "my test" do 
  array = [1,2,3]
  assert_equal 1, array.first
end

8. spec test

scala:

describe("Get of List"){
  it("(0) returns the first element")  {
    val array = List(1,2,3)
    array(0) should be 1
  }
}

ruby :

describe "Get of Array" do 
 it "first returns the first element" do 
   array = [1,2,3]
   array.first.should == 1
  end
end

9. web platform

scala:

Play 是一个开源高性能 Web 框架,能够基于 Java 或 Scala 编写可扩展可伸缩的应用系统,它能自动刷新源码的变动从而具有快速开发产品的能力,它还是一个无态非堵塞的框架,易于横向扩展。Play! 框架有如下特点:高开发效率:Java EE 和 Spring 框架并不适合快速原型开发,Play 框架参考动态语言的快速开发能力,它支持热重载所有的 Java 代码和模板等,让你更快地迭代。基于 Netty 构建非堵塞异步机制。RESTJSON 支持:非常容易编写 RESTful 应用,非常适合支持 HTTP 路由。

Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。它已经成功运用在电信行业。系统几乎不会宕机(高可用性 99.9999999% 一年只有 31ms 宕机

ruby: Ruby on Rails 是一个用于开发数据库驱动的网络应用程序的完整框架。Rails 基于 MVC 设计模式。从视图中的 Ajax 应用,到控制器中的访问请求和反馈,到封装数据库的模型,Rails 为你提供一个纯 Ruby 的开发环境。发布网站时,你只需要一个数据库和一个网络服务器即可。

10. performance

http://www.slideshare.net/El_Picador/scala-vs-ruby

写起来恶心死了,还是 ruby 更舒服

性能是巨大优势 不过不到 twitter 这种级别也没什么 主要看个人喜好了(如果有决策权的话)

#1 楼 @i5ting 程序员不就是要恶心自己,方便用户嘛,哈哈

#3 楼 @michael_roshen 之前用 scala for android,写的痛苦死了

... #4 楼 @i5ting 应该还是比 java 舒服吧。。。 至少静态类型语言里面我觉得是足够好用的了……

写个 CRUD 爱用哪个用哪个,如果再复杂点,还是要看生态圈的。有没有 scala Play 的分词库,拼音库。。。

#4 楼 @i5ting scala 本来就没有 ruby 简洁了,你再 for android,虽然没写过,但是感觉会引入很多 android 的开发包之类的,要是没有点基础,肯定发蒙

scala 的编译时间让我挺难受的...

If you want brackets, use Clojure If you want verbosity, use Java If you want both, use Scala

#9 楼 @luikore If you don't want both, use Ruby

#4 楼 @i5ting 另外,我觉得比 object-c 好看多了

coursera 用的 scala,据说是重构很方便。适合于大项目吧。 ruby 重构很难,好像没听说好的重构工具。

#12 楼 @chenge 重构还是别指望工具了吧

在学 scala,觉得模式匹配和 for-comprehension 都很好用,错误处理和 Future 也是很优雅的。 看了这篇,又学到了动态调用 补充一条打开类: Scala:

//通过隐式转换打开已有类,进行扩展
implicit class IntFun(i: Int) {
  def fun() = println("have fun")
}

> 2.fun()
> have fun

Ruby:

class Integer
  def fun
    puts "have fun"
  end
end

> 1.fun

求推荐高质量的 scala 社区

#15 楼 @loveltyoic 我也接触时间不长,同求

我是没找到。。。存在的似乎都死了。。。

性能差了这么多,这是真的吗?

性能没什么可比性,ruby 运行时都能扩展类,scala 可以么?

#20 楼 @rasefon 是我在 14 楼说的这种用法吗?

#21 楼 @loveltyoic 不完全是,我不知道 scala 有没有办法直接 eval 传进去的字符串。

#20 楼 @rasefon 应该是可以做到类似效果的……

eval 当然可以……因为 repl 是有的……当然实际上还是相当于编译运行了……

总之比动态语言麻烦多了。。。这方面确实比不了。。。

#23 楼 @kabie ruby 就是动态性好用,所以大家都喜欢,AR 就是很好的例子。

#23 楼 @kabie 2.10 之后已经可以 eval 了,而且有了 macro,在编译期就可以随便玩弄了。代价就是这门语言越来越可怕了...

import scala.tools.reflect.ToolBox
val tb = scala.reflect.runtime.currentMirror.mkToolBox()
tb.eval(tb.parse("println(1)"))

#25 楼 @saiga macro 是好东西……就是太难用。。。还是 Elixir 方便……

#25 楼 @saiga 这个叼,scala 也变得臃肿了,为了迎合大众的需求

You need to Sign in before reply, if you don't have an account, please Sign up first.