java与ruby的直观比较

Posted java达人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java与ruby的直观比较相关的知识,希望对你有一定的参考价值。


以前花过一段时间学习ruby,还顺便写了个股票爬虫,搭了数据展示网站,这次回顾一下以前的知识点,将ruby与java作个简单而直观的比较,这样有助于更深入地理解java。


一、ruby特性概览

1、动态强类型

    n=1  

    n= “hello world”//n类型可变

    n+4   //运行时报Type Error


    相对于ruby,java则是静态强类型

    int n = 1  //此处要指定类型

    n = “hello world”// 编译时报错


   静态类型与动态类型的选择,实际是可靠性与灵活性的选择,静态类型在编译时确保了类型安全,增强了软件的可靠性,但同时失去了灵活性,一个变量只能赋值某种类型,不便于扩展,相反动态类型则使程序更加地灵活和简洁,但在类型安全保障方面却不及前者有力。

2、完全面向对象

    4.4765.round  =>4

     nil.to_i  =>0

    ruby是完全面向对象的,就算是数字,nil(类似java中null)也可以当作对象处理,执行相应方法


3、脚本语言


4、在命令行输入irb即可获得一个简易的交互界面     

     irb(main):001:0> 


二、ruby vs  Java

1、简洁性

代码行数很重要!

实现同样一个输出功能,ruby的代码行数小于java,也许,正是出于简洁性的考虑,java8出了lambda表达式。

java:

public static void main(String[] args) throws IOException {

  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

  List al = new ArrayList();

  String line = null;

  while (null != (line = br.readLine())) {

    al.add(line);

    }

   Collections.sort(al);

   System.out.println("sorted:" );

   for (Iterator it = al.iterator(); it.hasNext();) {

       System.out.println(it.next());

   }

}

共14行


ruby:

puts readlines.sort.unshift("sorted:\n" ).join

共1行


2、ruby的代码块

本质:高阶函数的一种特殊形式,类似于java的匿名内部类

特点:1、使用时定义

           2、可引用外部局部变量(闭包)


java:使用偏重的匿名内部类,不通用

Execute( Callback  callback){

   p = ..

    ...

    callback.do(p);

   …

}


new Callback(Param  p){

   do(){

   }

}


ruby:

 def execute

      …

      yield

     …

 end


execute{|p|

     do anything….

 }



3、开放类(Open class)

 

  动态改变已存在类的类定义

   

4、动态类型

Java:

   public void  repair(Car car){


   }


Ruby:

  def  repair(c)


  end


5、ruby中的Aop与Ioc

AOP和依赖注入在ruby中是小菜一碟,但在java程序员而言,却要学习新的编程模型,处理XML,引进复杂的语法。


拦截器

目的:不修改代码,动态改变已定义类的行为,它支持AOP所需的大多数功能。


 (Ruby 2.0)能够在之前、之后和包装与Ruby方法钩连。

 class Class 

    alias_method :original_new, :new 

     def  new(*args) 

        result = original_new(*args)

        print “object creadted " 

       return result

   end 

end 



Ioc:

IoC是一种可以帮助我们解耦各业务对象间依赖关系的对象绑定方式,主要是依赖注入,java需要 Ioc service Provider专门管理,方便自动化测试


在ruby中,依赖注入是不必要的,它很容易修改运行中类的定义,你不需要在应用中添加新一层的复杂性,就可以注入新的行为


class Payment < ActiveRecord::Base  

  belongs_to :credit_card

  def capture 

      PaymentGateway.capture(amount, credit_card) 

  end 

end


class PaymentGateway          

 attr_accessor :desired_result

 def self.capture(amount, credit_card)     

    Response.new(desired_result)

 end 

end



三、Rails


rails project   

目录包含app 、config、script等


常用包:

Active Record:处理关系数据库访问

Active Pack: 处理请求,管理model/view/controller


它使用宏来帮助您快速生成基于数据库结构的代码和一些合理放置的宏

(1) create table

(2) ruby script/generate controller trails 

     ruby script/generate model trails 




java达人

ID:drjava

(扫码或长按识别)




以上是关于java与ruby的直观比较的主要内容,如果未能解决你的问题,请参考以下文章

与多维数组 ruby​​ 的数组值比较

通过 for 循环,比较 Python 与 Ruby 编程思想的差别

比较 Ruby 中二维数组的子数组,并显示结果数组与现有和遗漏的项目

通过 for 循环,比较 Python 与 Ruby 编程思想的差别

Python之通过for循环比较Python与Ruby编程思想的差别

ruby 将哈希值转换为排序的字符串数组,以便与另一个哈希值进行比较