Ruby Ruby VS Scala

michael_roshen · 2015年05月05日 · 最后由 michael_roshen 回复于 2015年05月06日 · 4805 次阅读

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

共收到 27 条回复

写起来恶心死了,还是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也变得臃肿了,为了迎合大众的需求

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册