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
- 揭秘前端字符的戏精之路
- 跨语言嵌入模型的调查
- React Native如何消除启动时白屏
- 如何在Python中将TimeDistributed层用于Long Short-Term Memory Networks
- react native 调用原生UI组件
- Android侧滑删除另一种实现,SwipeListView补充
- React Native调用原生组件
- React Native调用原生UI组件
- js不好学并不是因为它难,而是因为它容易混淆
- Gradle详解
- React Native网络请求fetch简单封装
- Promise机制
- React Native 自定义控件之验证码和Toast
- React 高阶组件HOC
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [PyQt Tutorial]4.使用Qt Designer
- [PyQt Tutorial]5.Signals & Slots(信号与槽)
- Docker数据共享与持久化
- [PyQt Tutorial]6.Layout Management(布局管理)
- Kubernetes入门
- [PyQt Tutorial]7.QDialog 类
- kubeadm快速部署kubernetes集群
- [PyQt Tutorial]8.QMessageBox
- Tomcat_01_简介
- Tomcat调优
- Tomcat_02_应用部署
- Tomcat_03_监控
- Kubernetes常用命令
- Oracle限制用户和客户端登陆
- 为什么说Java中只有值传递?