Ruby语言学习
ruby的定位: programer's best friend
它是一门面向程序员的语言,语法很灵活,功能很强大。 相比与严谨的java来说,ruby可谓敏捷的多了
ruby是自顶向下执行的。哪怕是在类里面,也是一行接着一行执行代码的。要深入理解ruby的函数面,因为用好块(block)和闭包(closure)极大的提高了代码的简洁和可读
rails : ruby 的 web框架。 基于 coc 的原则 和 ruby的动态语言特性可以很便捷的开发web应用。 类似于我们的webx框架
gem : 有时候也叫做rubygems , 是ruby下的包管理器 。 类似于 maven
ruby有它自己的虚拟机,会做ruby的内存管理,垃圾回收。 类似于java的jvm 。
Rvm: ruby version manager 是一个让多版本ruby环境共存的一套解决方案。
Jruby 100% 纯ruby实现的运行在java虚拟机下的语言,是结合ruby和java的桥梁
irb : 交互式的ruby运行环境,做写小测试,学习非常不错
ri : ruby的doc文档工具,非常强大
搭建ruby开发环境:
http://www.ruby-lang.org/en/downloads/
简单的介绍下我的环境搭建过程:
由于我用的是ubuntu操作系统,所以参照
http://lanvige.iteye.com/blog/851836 安装了rvm,中间虽然有几个问题但是稍微下资料也都顺利解决了。Ri , irb ,gem等都没有问题。可是问题出在如果用netbeans进行debug的话,无法进行fast debug,有相应的依赖没有解决掉。网上查了些资料也没给出个解决方法。
无奈之下就只有放弃rvm直接进行ruby环境安装了。超级简单,按如下:
http://ryanbigg.com/2010/12/ubuntu-ruby-rvm-rails-and-you
下载了个安装脚本,作者把所以该解决的依赖都解决了。所有问题都不在了。。。
ide用过radrails和netbeans , 感觉还是netbeans要好一点。
我的一些实践,近距离感觉一下ruby
1如何打印一句hello world
java: 定义一个类,再定义一个main方法,然后编译,然后再运行
ruby:
wuzhong@TAOBAOWDS46:~$ ruby -e "p 'hello'"
"hello"
ruby 类似于 java命令,指向的是他们的运行环境, -e 标识后面跟着一个ruby脚本 p 'hello';
p 就是print方法,内置在ruby core中,所以可以直接拿来用。
字符串可以用“ 也可以用 ' ,但是有区别的:
请看这个例子
a='hello'
puts "#{a}"
puts '#{a}'
输出的结果是:
hellohello echo
hello
#{a}
2ruby的类型结构
在ruby中,一切皆是对象。。这个比java更加要明确一点,毕竟java夹杂着原子类。
irb(main):012:0> /abc/.class
=> Regexp
irb(main):013:0> (1..9).class
=> Range
irb(main):002:0> 1.class
=> Fixnum
irb(main):003:0> "a".class
=> String
irb(main):004:0> nil.class
=> NilClass
irb(main):005:0> 111111111111111111111111111111111111111111111.class
=> Bignum
irb(main):006:0> 0.1.class
=> Float
irb(main):007:0> [1,2].class
=> Array
irb(main):013:0> {"a"=>1,"b"=>2}.class
=> Hash
irb(main):014:0>
irb(main):015:0* Hash.new.class
=> Hash
irb(main):016:0> true.class
=> TrueClass
irb(main):017:0> false.class
=> FalseClass
3. 看一下 block的威力,大幅缩减代码量
irb(main):025:0> (1..10).each{|i| p i}
1
2
3
4
5
6
7
8
9
10
=> 1..10
irb(main):030:0> (1..10).each do |i|
irb(main):031:1* p i
irb(main):032:1> end
输出同样的结果
了解一下过程: 首先 1..10 这个返回的是一个Range。我们可以通过 (1..10).class来验证。
接下来我们需要迭代这个数组: ri Range 我们发现有个each方法。。ri Array.each参照doc文档就很简洁的写出上面的代码来了。 注意代码块 可以用 { } 也可以用 do end
wuzhong@TAOBAOWDS46:~/workspace/ruby/block$ more repeat.rb
def repeat(n)
if block_given?
n.times { yield }
else
raise ArgumentError.new("I can't repeat a block you don't give me!")
end
end
repeat(4) { puts "Hello." }
p "=========================="
repeat(4)
wuzhong@TAOBAOWDS46:~/workspace/ruby/block$ ruby repeat.rb
Hello.
Hello.
Hello.
Hello.
"=========================="
repeat.rb:5:in `repeat': I can't repeat a block you don't give me! (ArgumentError)
from repeat.rb:11:in `<main>'
4.ruby 的语法糖,便于扩展。
Ruby 是一个相当灵活的语言,她允许用户去改变她本身。 Ruby 的核心部分可以被更改或重新定义,模块可以被添加。Ruby 试着不去妨碍程序员。
比如(+) 是用做加法的运算符。如果你更喜欢使用易读的 plus 的话,你可以给 Ruby 的内建 Numeric 类添加一个函数。
class Numeric
def plus(x)
self.+(x)
end
end
y = 5.plus 6
# y is now equal to 11
同样的元编程也是基于这个原理,定义或者覆盖原来的方法
5.ruby 继承
class Child < Father
end
mixin
于其他面向对象语言不同,Ruby “有意”只提供单继承。不过 Ruby 拥有模块(在 Objective-C 里面叫做类别)。模块是把许多方法放在了一个类别里。
类可以混合一个模块,得到这个模块提供的所有方法。比如所有提供 each 方法的类可以混合 Enumerable 模块,来得到这个模块提供的所有方法,当然这些方法都会调用 each 做循环。
class MyArray
include Enumerable
end
一般来说,Ruby 爱好者相对于复杂和限制颇多的多态继承方法来讲更偏向于这种混合方法。
这篇文章介绍的比较通俗易懂了
http://thinkinginruby.iteye.com/blog/148967
6. ruby的封装性
局部变量 以小写字母或下划线卡头 var _var
全局变量 以$开头 $var
类变量 类中定义,以@@开头 @@var
实例变量 对象中定义,以@开头 @var
常量 以大写字母开头 Var
#定义了一个全局变量
$pub_var = "public var"
class Person
#定义了一个类变量,类比于java的static
@@name2 = $pub_var
#实例变量 attr_accessor会自动生成get 和set方法
attr_accessor :name
def initialize
#定义的局部变量
age =12
@name = "test"
p age
# @@name2 = "person"
# name = "test123"
end
#定义一个类方法
def self.name2
@@name2
end
private
def test
p "test"
end
public
def test2
p "test2"
end
end
ps = Person.new
p ps.name
p ps.age
#p ps.name2
p Person.name2
7. ruby 来处理xml
应用场景主要是maven的pom文件,当前清空工程里有很多依赖库,但是都是乱序排列的
目标: 通过该脚本对dependencies中的元素进行排序
# To change this template, choose Tools | Templates
# and open the template in the editor.
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
require 'rexml/document'
include REXML
class PomFormater
def initialize(file_name)
Dir.chdir("lib")
raise Exception.new(file_name + " dosn't exist") unless File.file?(file_name)
@doc = Document.new(File.new(file_name))
end
def sort
dependencys = XPath.first(@doc, "*/dependencyManagement/dependencies")
#p dependencys.size
parent = dependencys.parent
#p parent
elements = Element.new("dependencies")
parent.delete_element(dependencys)
parent.add_element(elements)
arr = Array.new
taobao_arr = Array.new
ali_arr = Array.new
dependencys.each_element do |element|
group_name = element.elements["groupId"].text.downcase
if group_name =~ /com.taobao/
taobao_arr << element
elsif group_name =~ /com.alibaba/
ali_arr << element
else
arr << element
end
end
arr = arr.sort_by{|x| x.elements["groupId"].text.downcase }
taobao_arr = taobao_arr.sort_by{|x| x.elements["groupId"].text.downcase }
ali_arr = ali_arr.sort_by{|x| x.elements["groupId"].text.downcase }
taobao_arr.concat(ali_arr).concat(arr)
taobao_arr.each { |e| elements.add_element(e) }
end
def out_put
s = ''
@doc.write(s)
open("tmp.xml","w"){|f| f << s }
p "please format it in your ide"
end
end
测试代码
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
require 'test/unit'
require 'pom_formater'
class Demo
def foo
p "this is demo.foo method"
end
end
class PomFormaterTest < Test::Unit::TestCase
def test_foo
pf = PomFormater.new("pom_1.xml")
pf.sort
pf.out_put
end
def test_demo
Demo.new.foo
end
end
8. jruby的应用
the best of jvm . 是不是best暂且不予评论
jruby能充分使用ruby的动态性和语法的简洁性,同时可以使用丰富的java企业级类库。 最终要的是可以直接集成到现有的javaee应用中去.
知识我们需要安装jruby的运行环境,和jdk差不多,分别设置jruby_home 和 path 就OK了,使用起来也很方便。。
require 'java' //jruby 需要申明这个,其余都一样了
include_class 'com.taobao.wuzhong.spring.Hello'
class JrubyHello //千万不要用"< Hello"来实现接口,否则和java集成会报错
def hello
p "this is jruby"
end
end
和java集成:
@Test
public void test() throws ScriptException {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine engine = m.getEngineByName("jruby");
engine.getContext().setAttribute("a", new Integer(11), ScriptContext.ENGINE_SCOPE);
engine.eval("puts 2 + $a");
}
另外如果使用spring的话,框架已经支持jruby和groovy了
<lang:jruby id="jhello"
script-interfaces="com.taobao.wuzhong.spring.Hello"
refresh-check-delay="1000"
script-source="classpath:com/taobao/wuzhong/spring/JrubyHello.rb">
</lang:jruby>
补充资料:
ruby和java的异同
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-java/
http://onestepback.org/articles/10things/
http://blog.csdn.net/zl728/archive/2010/08/14/5812901.aspx
很好quickstart
http://www.ruby-lang.org/en/documentation/quickstart/
闭包问题:
http://www.ibm.com/developerworks/cn/java/j-cb01097.html
http://www.blogjava.net/ponzmd/archive/2007/09/19/146552.html
分享到:
相关推荐
实用的Ruby编程技巧:除了基本规则,还提供了Ruby语言的高级技巧和最佳实践。 集成自动化工具:包括配置文件,可用于流行的代码质量检测工具,如RuboCop,以自动化代码审查过程。 持续更新:随着Ruby语言和开发实践...
Ruby自然语言处理资源 自然语言处理(NLP)Ruby库,工具和软件的集合。 欢迎提出建议和意见。 分类目录 机器学习 机器翻译 各种各样的 多功能工具 命名实体识别 Ngrams 号码 解析器 词性标注 可读性 常用表达 Ruby ...
第三天 完成《Ruby语言入门教程》,并上机调试 熟悉Ruby语言基本语法和常用函数 第四天 完成《Ruby语言进阶教程》,并上机调试 第五天 按照《应用Rails进行敏捷Web开发.pdf》学习第二部分购物车示例。...
闭包是 Ruby 相对其它语言特别优势之一,很多语言有闭包,但是唯有 Ruby 把闭包的优势发挥得淋漓尽致。Ruby 的哲学之一:同一个问题现实中有多种解决方法,所以 Ruby 中也有多种解法,所以闭包的使用也有多种方法。 ...
Storm是一个免费开源、分布式、高容错的实时计算系统。Storm令持续不断的流计算变得容易,弥补了Hadoop批处理...默认支持Clojure、Java、Ruby和Python。要增加对其他语言的支持,只需实现一个简单的Storm通信协议即可。
本文是对一个程序员五年学习观的总结,涵盖了多个方面的知识点,包括C语言、C++语言、设计、架构、敏捷开发、模式、思想类、开发语言、Linux/Unix等。 C语言 * 《C 和指针》、《C 缺陷和陷阱》、《C 专家编程》是...
该源码基于, 主要记录了自己所学时的笔记, 总结和经验, 包括下面这些内容:知识树和技术栈: 如何从0开始理解和学习一门语言.吉他和Ukelele学习.一些随想笔记.Usage安装环境git clone ...
这是一个记录我写力扣题和学习算法的笔记 Progress 进度 Currently ranked about ~15,500 on LeetCodeCN Quick Links 快速链接 summary for questions based on types 问题按照类别的总结 91 天学算法第四期是一个...
第三部分将之前介绍的各种知识落实到6种常用语言.net、java、javascript、php、python、ruby中,不但详细介绍了语言中正则表达式的用法,更点明了版本之间的细微差异,既可以作为专门学习的教材,也可以作为有用的...
总结 2. 安装和运行Maven 2.1. 验证你的Java安装 2.2. 下载Maven 2.3. 安装Maven 2.3.1. 在Mac OSX上安装Maven 2.3.2. 在Microsoft Windows上安装Maven 2.3.3. 在Linux上安装Maven 2.3.4. 在FreeBSD或...
学习曲线低,非专业人士也能上手 开源系统,拥有强大的生态圈 解释型语言,完美的平台可移植性 支持面向对象和函数式编程 能够通过调用C/C++代码扩展功能 代码规范程度高,可读性强 目前几个比较流行的领域,...
该解决方案将以任何编程语言提供。 欢迎您在资源库中做出贡献。 对于存储库中的贡献,请阅读贡献准则。 目录 主持人 Shoaib Rayeen-我是Airtel Africa的一名软件开发工程师。 随时与我联系 对存储库做出贡献的...
1.3 由perl和ruby语言实现的web服务客户端 10 1.4 了解soap 11 1.5 java语言实现web服务请求 13 1.6 基于通信层的http和soap消息跟踪 14 1.7 目前为止还有什么不清楚 16 1.8 java soap编程api 18 1.9 带有复杂数据...
网上有人总结几种编程语言的特点,我觉得也挺有道理的: 复制代码 代码如下: PHP 就是: Quick and Dirty Java 就是: Beauty and Slowly Ruby 就是: Quick and Beauty python 就是: Quick and Simple 在PHP的...
在单机,Hadoop,Spark,Dask,Flink和DataFlow上运行微软认知工具包(CNTK),一种开源深度学习工具包- :books: C / C ++技术面试基础知识总结,包括语言,程序库,数据结构,算法,系统,网络,链接加载库等知识...
来自最新的语言学研究图书简介:如果您不会说英语,那还不错!广泛阅读/ Tadoku简介Brighture Blog为什么日语不能流利地说英语? *除此之外,还推荐所有Brighture博客(Hiroshi Matsui的文章)。其他荣乐介绍如何通
目前支持 Java, C++, C#, Python, Ruby, JavaScript, Swift, Scala, Clojure, 将来还会支持更多编程语言。 在线阅读 https://www.gitbook.com/book/soulmachine/algorithm-essentials/ 内容目录 介绍 线性表 ...
19.1 一个较为激进的示例:Ruby on Rails框架中的ActiveRecord库 396 19.2 使用动态特征实现Scala 中的动态调用 397 19.3 关于DSL的一些思考 402 19.4 本章回顾与下一章提要 402 第20章 Scala的领域...
2012-06-11 21:35 50,176 关于c语言和汇编语言相互嵌套调用的学习总结.doc 2012-06-11 21:11 190,993 典型算法包.rar 2012-06-11 21:16 264,555 内存管理和设备调试中文.pdf 2012-06-11 21:30 267,989 冈萨雷斯数字...