1. Ruby执行选项

符号 作用
-c 检查代码正确性
-w 警告模式运行
-e 字面脚本
-l 行模式运行

单独

  1. ruby -c Hello.rb

组合

  1. ruby -le 'print "Hello";print "Ruby"'

2. 常量,变量

2.1 常量

通常以首字母大写或全部大写为常量。

  1. CON1=1000
  2. puts "I got"+CON1.to_s+"RMByuan"
  3. CON1=100 #不报错但是给出警告
  4. puts "Now only"+CON1.to_s+"yuan"

2.2 变量

2.2.1 局部变量

类,模块,方法这些作用域里面有效。下划线_,a-z开头。

2.2.2 全局变量

作用于全局。以$开头
Ruby自带全局变量:

全局变量 说明
$0 Ruby脚本文件名
$* 命令行参数
$= 是否区分大小写
$_ 最近读的字串

3. 数据类型

3.1 数值

两种整形Fixnum,Bignum,一种Float型,数据类型也是对象。用.class 来查看当前变量的数据类型。

  1. i=2**30 #基本数据类型也是一个对象
  2. k=2**30-1
  3. puts "i="+i.to_s+"类型是"+i.class.to_s #.class可以得到该数值的类型
  4. puts "k="+k.to_s+"类型是"+k.class.to_s
  5. f=3.1415
  6. puts "f="+f.to_s+"类型是"+f.class.to_s

i=1073741824类型是Bignum
k=1073741823类型是Fixnum
f=3.1415类型是Float

3.2 范围

=== 来判断右边对象是否在左边对象里面

  1. #..与...的区别
  2. a=1..5
  3. b=1...5
  4. print "a的元素是"
  5. a.each do|i|
  6. print i.to_s
  7. end
  8. puts "\n",a===5
  9. print "b的元素是"
  10. b.each do|i|
  11. print i.to_s
  12. end
  13. puts "\n",b===5

a的元素是12345
true
b的元素是1234
false

常用方法:

方法 说明
to_a 转换成一个数组
include?() 或者 === 是否包含
min() begin() firsst() 最小值
max() end() last() 最大值

常用迭代器

迭代器 说明
regect 转为数组,删除满足条件元素
select 转为数组,选择满足条件元素
each 输出迭代范围中每个元素

其中each最为常用,演示如下

  1. a=1..10
  2. a.each do|i|
  3. print i.to_s+" "
  4. end

1 2 3 4 5 6 7 8 9 10

3.3 符号

符号对象是 字符串,方法,类,或者标识符的内部表示形式。
:或者 %{} 创建符号对象

  1. str1="good morning"
  2. sym1=:"good morning"
  3. puts str1==sym1 #比较对象
  4. puts str1.to_sym==sym1 #字符串转成符号后比较内容
  5. puts sym1.to_s==str1 #符号转成字符串后比较内容

false
true
true

4. 运算符

  1. 基本:求余 % , 乘方 ** 其他:+,-,*,/
  2. 赋值运算:=,+=,-=,#=,/=,%=,**=
  3. 位运算符:
位运算符 说明 位运算符 说明
& 按位 与 << 向左移位
>> 按位 或 >> 向右移位
~ 按位非 ^ 异或

4. 比较运算

运算符 说明 运算符 说明
!= 不等于 =~ 正则表达式匹配
<=> 比较两对象结果1,0,-1 !~ 正则表达式不匹配

5. 逻辑运算

逻辑运算符 含义
&& 逻辑“且”
|| 逻辑“或”
逻辑“非”

6. 三目运算符
score<600? "仍需努力":"考上复旦没问题"

5. 语句

5.1 if

  1. if(条件) then
  2. 代码块
  3. elsif(条件)
  4. 代码块
  5. else
  6. 代码块
  7. end

if 对应的是 elsif 而不是elseif.
可以省略then关键字

unless与if相反,unless后面的语句结果是true时执行 第二个代码块,否则执行第一个代码块

  1. unless(条件) then
  2. 代码块1
  3. else
  4. 代码块2
  5. end

5.2 case语句

  1. case 表达式
  2. when 常量1,常量2...常量3 then
  3. 代码块1
  4. when 常量n.. then
  5. 代码块2
  6. else 代码块3

when 后面可以是Range对象。
表达式的值常量进行比较需要用=== 而不是==

5.3 循环

while循环:

  1. while (条件) do
  2. 代码块
  3. end

until循环:

  1. until (条件) do#条件表达式为false代码块被执行
  2. 代码块
  3. end

for…in语句主要用于 数组Hash对象

  1. for 自定义名称 in Array|Hash do
  2. 代码块1
  3. end

迭代器

  1. Array.each do|定义的变量名|
  2. 代码块
  3. end

5.4 跳转

break next return

6. 数据处理

6.1 字符串

双引号的字符串,与单引号的字符串

  1. strd="good\nmorning"
  2. strs='good\n morning'
  3. puts strd
  4. puts strs

运行结果:

good
morning
good\n morning

转义字符与特殊字符

字符串 含义
\a Bell对应符号
\nnn nnn 是八进制数,替换成字符
\b 退格
\xnn xnn 是十六进制数,替换成字符
\e esc 键的字符
\cx ctrl+X 对应字符,x可以是任意对应字符
\C-x 同上
\n 换行
\M-x Alt+x 对应字符,x可以是任意对应字符
\r 回车
\M-\C-x ctrl+alt+x,x任意键
\s 空白符
\t Tab键对应字符
\v 垂直Tab键对应字符
#{} 替换成变量或者表达式所对应的

6.2 字符串操作

合并

+ 符号合并

  1. a="我的名字是"
  2. b="Philippian"
  3. c=a+b
  4. puts c

我的名字是Philippian

<< 合并

  1. a="我的名字是"
  2. b="Philippian"
  3. a<<b
  4. puts a

我的名字是Philippian

替换 复制 改变

替换replace 方法

  1. str="hehe"
  2. puts "替换前是"+str
  3. str.replace("呵呵哒")
  4. puts "替换后是"+str

替换前是hehe
替换后是呵呵哒

复制 dup clone 方法
dup只复制内容,clone 复制其特殊方法,taint,freeze等信息

  1. str="Philippian"
  2. puts str.dup
  3. puts str.clone

Philippian
Philippian

改变 有多种方法,如下:

方法 说明 方法 说明
capitalize 首字母大写 Rstrip 去掉右边空格
reverse 字符反转 Lstrip 去掉左边空格
chomp 去掉最后换行符 upcase 大写
Chop 山区最后字符 downcase 小写
swapcase 大小写转换    

获取

  1. str="Philippian"
  2. puts "第二个字符为"+str[1]
  3. puts "二到六字符为"+str[1..5]
  4. puts "第二个字符的ASCII值是"+str[1].ord.to_s
  5. puts "从第5个字符开始往后的三个字符"+str[4,3]

第二个字符为h
二到六字符为hilip
第二个字符的ASCII值是104
从第5个字符开始往后的三个字符ipp

比较

  1. a=String.new
  2. a="good"
  3. b=a #a b指向同一内存
  4. c="good" #c与ab不同
  5. puts a==b #ab内容相同
  6. puts a.eql?b #ab内容相同
  7. puts a==c #ac内容相同
  8. puts a.eql?c #ac内容相同
  9. puts a.equal?c #ac不是同一对象
  10. puts a.equal?b #ab是同一对象

true
true
true
true
false
true

比较大小
使用<=> 符号比较字符串大小,表达式的结果和含义如下:

结果 含义
-1 右边字符串大
0 相同
1 左边字符串大

6.3 Hash

创建Hash对象。形式为 key=>value

  1. student={
  2. "num"=>"11001101110"
  3. "name"=>"Philippian"
  4. "sex"=>"m"
  5. "major"=>"computer science"
  6. }

或者:

  1. student=Hash.new
  2. student["num"]="11001101110"
  3. student["name"]="Philippian"

常用方法:

方法 说明
size() length() Hash对象长度
include?(key) has_key?(key) 是否包含某个key
delete(key) 删除指定元素
keys() 得到全部key组成的数组
values() 得到全部value组成的数组

迭代器

迭代方法 说明
each 输出全部元素 key和value
each_key 输出所有key
each_value 输出所有value
each_pair 输出所有key-value对

6.4 数组

两种方式创建数组:
1

  1. stu_name=["小明","小强","小刚","小红","小芳"]

2

  1. stu_name=Array.new
  2. stu_name[0]="小明"
  3. stu_name[1]="小强"

取元素:

  1. stu_name=["小明","小强","小刚","小红","小芳"]
  2. puts stu_name[-2] #倒数第二个
  3. puts stu_name[2] #正数第三个

小红
小刚

增删元素

方法 说明
unshift() 头部添加数组元素
push() 尾部添加数组元素
<< 尾部添加一个数组元素
shift() 头部删除
pop() 尾部删除

组合与截取

  1. stu_name1=["小明","小强","小刚"]
  2. stu_name2=["小红","小芳"]
  3. stu_name1.concat(stu_name2) #将第二个数组加到第一个里面
  4. puts stu_name1
  5. puts "------"
  6. puts stu_name1[2..4] #截取第三个到第五个

小明
小强
小刚
小红
小芳
——
小刚
小红
小芳

7. 类,对象,方法

7.1 类

注意:
1. 类的定义
2. 表达式的执行
3. 方法定义
4. self 关键字
5. 创建对象
6. 对象调用方法

  1. class Man #类的名字首字母大写
  2. puts "I am a man" #表达式直接执行
  3. puts self.class #self关键字指自己,此时self为类
  4. def sayName name #定义方法,方法名后面是参数
  5. puts "my name is "+name.to_s
  6. puts self.class
  7. #self关键字指自己,此时为Man创建的对象
  8. end
  9. end
  10. stu1=Man.new #创建对象
  11. stu1.sayName("Philippian") #调用方法

I am a man
Class
my name is Philippian
Man

7.1.1 追加类

名字相同的类自动合并

  1. class Student
  2. def sayName name
  3. puts "my name is "+name
  4. end
  5. end
  6. class Student
  7. def sayAge age
  8. puts "my age is "+age.to_s
  9. end
  10. end
  11. Phi=Student.new
  12. Phi.sayAge 18
  13. Phi.sayName "Philippian"

my age is 18
my name is Philippian

7.1.2 嵌套类

也叫内部类,使用内部类用::

  1. class Student
  2. def sayName name
  3. puts "My name is "+name
  4. end
  5. class Homework
  6. def doHomework
  7. puts "I did my Homework"
  8. end
  9. end
  10. end
  11. he=Student.new
  12. he.sayName "Philippian"
  13. math=Student::Homework.new
  14. math.doHomework

My name is Philippian
I did my Homework

7.1.3 特殊类

专门为某个对象添加的类

  1. class Student
  2. def sayName name
  3. puts "My name is "+name
  4. end
  5. end
  6. he=Student.new
  7. he.sayName "Philippian"
  8. class << he #特殊类
  9. def singSong song_name
  10. puts "I sang a song, its name is "+song_name
  11. end
  12. end
  13. he.singSong "我有一只小毛驴"

My name is Philippian
I sang a song, its name is 我有一只小毛驴

7.2 方法

7.2.1 默认参数

  1. class Student
  2. def saySomething sentences="I am a Student" #设置默认参数的值
  3. puts sentences
  4. end
  5. end
  6. he=Student.new
  7. he.saySomething #没有参数时候
  8. he.saySomething "I want to have a holiday!" #有的参数值时候

I am a Student
I want to have a holiday!

7.2.2 返回值

  1. class Xiaoming
  2. def sayName
  3. "Xiaoming"
  4. end
  5. def sayAge
  6. return 19
  7. end
  8. end
  9. xiaoming=Xiaoming.new
  10. puts xiaoming.sayName
  11. puts xiaoming.sayAge.to_s

Xiaoming
19

7.2.3 特殊方法

  1. class Student
  2. def sayName name
  3. puts "My name is "+name
  4. end
  5. end
  6. he=Student.new
  7. he.sayName "Philippian"
  8. def he.sayAge age #特殊方法
  9. puts "My age is "+age.to_s
  10. end
  11. he.sayAge 18

Xiaoming
19

7.2.4 类方法

  1. class Student
  2. def Student.sayClass
  3. puts self.class
  4. end
  5. end
  6. Student.sayClass

Class

7.2.5 构造方法

构造方法名字为initialize ,当调用new方法创建对象的时候,自动调用initialize 初始化

  1. class Student
  2. def initialize name,age
  3. @name=name
  4. @age=age
  5. end
  6. def show
  7. puts "My name is #{@name}, My age is #{@age}"
  8. end
  9. end
  10. he=Student.new "Philippian",19
  11. he.show

My name is Philippian, My age is 19

7.3 变量与属性

7.3.1 实例变量

实例变量用于在类内部共享数据。 变量名以@ 开头。
可以在以下几个地方声明实例变量:

  • 顶层和顶层方法,
  • 类和类方法,
  • 模块和模块方法
定义位置 作用域
顶层 顶层表达式和顶层函数
类、模块 当前类,当前模块
类方法 当前类下所有方法

7.3.2 类变量

类变量用于在各个类之间共享数据。允许定义位置与实例变量相同
类变量以@@ 开头

7.3.3 属性

属性设置器和读取器

  1. class Student
  2. @university
  3. def setUniversity=(val)
  4. @university=val
  5. end
  6. def university
  7. @university
  8. end
  9. end
  10. he=Student.new
  11. he.setUniversity="SYSU"
  12. puts he.university

SYSU

声明属性的标识符

标识符 示例 说明
attr attr:attr1,key key值false时为只读
attr_reader attr_reader: attr1,attr2 一个或多个只读属性
attr_writer attr_writer: attr1,attr2 一个或多个 只写属性
attr_accessor attr_accessor: attr1,attr2 一个或多个可读写属性

7.4 类的继承

  1. class Animal
  2. def eat
  3. puts "I can eat"
  4. end
  5. def breathe
  6. puts "I can breathe"
  7. end
  8. end
  9. class Dog<Animal #继承
  10. def run #Dog类自己的方法
  11. puts "I am a dog, I can run"
  12. end
  13. def eat #重写父类的方法
  14. puts "I am a dog, I like eating bone"
  15. end
  16. end
  17. wangwang=Dog.new
  18. wangwang.eat
  19. wangwang.breathe
  20. wangwang.run

I am a dog, I like eating bone
I can breathe
I am a dog, I can run

访问父类构造方法

  1. class Student
  2. def initialize (name, age)
  3. @name=name
  4. @age=age
  5. end
  6. def saySomething
  7. puts "I can say something"
  8. end
  9. end
  10. class UniversityStudent<Student
  11. def initialize stu_num
  12. @stu_num=stu_num
  13. super("Philippian", 18) #super关键字访问父类构造方法
  14. end
  15. def show
  16. puts "My name is #{@name}, my age is#{@age}, \nmy student numbe is #{@stu_num}"
  17. end
  18. end
  19. he=UniversityStudent.new 1111111111
  20. he.saySomething
  21. he.show

I can say something
My name is Philippian, my age is18,
my student numbe is 1111111111

7.5 作用域

访问保护 名称 说明
private 私有方法 方法指定成员只能被类内部访问,对类外部不可见
protected 保护方法 可以被隶属的子类访问
public 共有方法 没有访问限制

两种方法定义访问级别
1. 使用无参数的方法

  1. class Animal
  2. def eat #默认public
  3. puts "I can eat"
  4. end
  5. public #定义为公有方法
  6. def drink
  7. puts "I can drink"
  8. end
  9. private #定义为私有方法
  10. def breathe
  11. puts "I can breathe"
  12. end
  13. protected #定义为保护方法
  14. def run
  15. puts "I can run"
  16. end
  17. end

‘2. 使用参数指定成员

  1. class Animal
  2. def eat
  3. puts "I can eat"
  4. end
  5. def run
  6. puts "I can run"
  7. end
  8. def breathe
  9. puts "I can breathe"
  10. end
  11. private(:eat) #定义为私有方法
  12. protected(:breathe,:run)#定义为保护方法
  13. end

7.6 代码块

{ } 或者 do...end 创建代码块,用yield 传入代码块

  1. def saySomething
  2. puts "This is the 1st in method"
  3. yield
  4. puts "This is the 2nd in method"
  5. end
  6. saySomething do
  7. puts "This is in a block"
  8. end
  9. saySomething{
  10. puts "This is in a block too"
  11. }

This is the 1st in method
This is in a block
This is the 2nd in method
This is the 1st in method
This is in a block too
This is the 2nd in method

此外,代码块还可以有参数、返回值等。

1. Ruby基础知识的更多相关文章

  1. ruby 基础知识(一)

    突然今天发现一大神的博客:http://www.cnblogs.com/jackluo/archive/2013/01/22/2871655.html    相信初学者会受益颇多 ruby  参考文档 ...

  2. ruby 基础知识(二)

    ruby  中的动态方法 http://singleant.iteye.com/blog/1680382 Rails 大量使用了符号(symbol).符号看上去很像变量名,不过以冒号作为前缀.符号的例 ...

  3. 【ruby】ruby基础知识

    Install Ruby(安装) For windows you can download Ruby from http://rubyforge.org/frs/?group_id=167 for L ...

  4. ruby 基础知识 - Class 与 Module

    原文 1. 因為 Ruby 並沒有「屬性」(property/attribute)這樣的設計,要取用實體變數,需要另外定義的方法才行: class Cat def initialize(name, g ...

  5. ruby基础知识之 class&module

    以下分别介绍了class方法和module方法,还有最简单的def方法. 其中module和class的区别下面会说,这里首先声明,def定义的方法,需要定义对象后才能调用,而class和module ...

  6. ruby 基础知识三 读写文件

    1.File 中参数的含义 r 只读模式.文件指针被放置在文件的开头.这是默认模式. r+ 读写模式.文件指针被放置在文件的开头. w 只写模式.如果文件存在,则重写文件.如果文件不存在,则创建一个新 ...

  7. ruby 基础知识2 - 区块 block

    原文 1. block中的 yield 与遍历 5.times do |i| puts i end 或者 def my_times(n) i = 0 while n > i i += 1 yie ...

  8. Ruby基础教程

    一.Ruby基础知识 1.关于Ruby Ruby是脚本语言 Ruby是面向对象语言 Ruby是跨平台语言 Ruby是开放源码软件 2.Ruby入门书籍推荐 <Ruby.Programming向R ...

  9. ruby基础(四)

    ruby基础知识 模块 模块是ruby的特色功能之一.如果说类是事物的实体以及行为,那么模块表现的 就是事物的行为部分,模块和类有以下两点不同: 模块不能拥有实例 模块不能被继承 模块的使用方法 mo ...

随机推荐

  1. StackExchange.Redis.DLL 操作redis加强版

    直接引用StackExchange.Redis.dll这一个dll来操作redis App.config配置 <?xml version="1.0" encoding=&qu ...

  2. Android Studio模拟器无法访问网络

    Android Studio3.5 模拟器无法访问网络的原因?

  3. Python写一个简单的爬虫

    code #!/usr/bin/env python # -*- coding: utf-8 -*- import requests from lxml import etree class Main ...

  4. 新版本vue-cli3.x 无法热更新问题【转载】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_38644883/articl ...

  5. C++的随机数

    C++产生随机数 C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand(). 不过,由于rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是 ...

  6. Nmap目录扫描和漏洞扫描(9.27 第十三天)

    目录扫描:扫描站点的目录,寻找敏感文件(目录名.探针文件.后台.robots.txt[].备份文件等) 目录:站点结构,权限控制不严格 探针文件:服务器配置信息,phpinfo.php   readm ...

  7. html 基础 (9.19 第八天)

    一.HTML:超文本标记语言,是一种标签语言,不是编程语言,显示数据有双标签<body></body> 和单标签<img src=# / >, 标签大小写都可以通过 ...

  8. tableau中图形分析相关设置

    1.柱形堆叠图单元格顶部显示总计值(可通过参考线实现) 2.调节图形单元格的宽窄度 (ctrl + 右键/左键) 3.折线图预测区间 趋势区间线 分析中预测并不是针对所有的日期格式均其作用,比如日期格 ...

  9. storm on yarn安装时 提交到yarn失败 failed

    最近在部署storm on yarn ,部署参考文章 http://www.tuicool.com/articles/BFr2Yvhttp://blog.csdn.net/jiushuai/artic ...

  10. java课程之团队开发冲刺阶段2.2

    一.总结昨天进度 1.单独实现静音功能,还没有进行整体整合 二.遇到的问题 1.一开始设计静音的思路有问题,所以在实现上有些许麻烦,一开始的想法是将这些音量直接设置为0就可以实现静音,但是在恢复响铃模 ...