热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

1.Ruby基础知识

1.Ruby执行选项符号作用-c检查代码正确性-w

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

单独

ruby -c Hello.rb

组合

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

2. 常量,变量

2.1 常量

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

CON1=1000
puts "I got"+CON1.to_s+"RMByuan"
CON1=100 #不报错但是给出警告
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 来查看当前变量的数据类型。

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

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

3.2 范围

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

#..与...的区别
a=1..5
b=1...5
print "a的元素是"
a.each do|i|
    print i.to_s
end
puts "\n",a===5
print "b的元素是"
b.each do|i|
    print i.to_s
end
puts "\n",b===5

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

常用方法:

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

常用迭代器

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

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

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

1 2 3 4 5 6 7 8 9 10

3.3 符号

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

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

false
true
true

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

4. 比较运算

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

5. 逻辑运算

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

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

5. 语句

5.1 if

if(条件) then
    代码块
elsif(条件)
    代码块
else
    代码块
end

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

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

unless(条件) then
    代码块1
else
    代码块2
end

5.2 case语句

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

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

5.3 循环

while循环:

while (条件) do
代码块
end

until循环:

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

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

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

迭代器

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

5.4 跳转

break next return

6. 数据处理

6.1 字符串

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

strd="good\nmorning"
strs='good\n morning'
puts strd
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 字符串操作

合并

+ 符号合并

a="我的名字是"
b="Philippian"
c=a+b
puts c

我的名字是Philippian

<< 合并

a="我的名字是"
b="Philippian"
a<

我的名字是Philippian

替换 复制 改变

替换replace 方法

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

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

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

str="Philippian"
puts str.dup
puts str.clone

Philippian
Philippian

改变 有多种方法,如下:

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

获取

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

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

比较

a=String.new
a="good"
b=a #a b指向同一内存
c="good"  #c与ab不同
puts a==b #ab内容相同
puts a.eql?b #ab内容相同
puts a==c #ac内容相同
puts a.eql?c #ac内容相同
puts a.equal?c #ac不是同一对象
puts a.equal?b #ab是同一对象

true
true
true
true
false
true

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

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

6.3 Hash

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

student={
    "num"=>"11001101110"
    "name"=>"Philippian"
    "sex"=>"m"
    "major"=>"computer science"
}

或者:

student=Hash.new
student["num"]="11001101110"
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

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

2

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

取元素:

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

小红
小刚

增删元素

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

组合与截取

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

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

7. 类,对象,方法

7.1 类

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

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

I am a man
Class
my name is Philippian
Man

7.1.1 追加类

名字相同的类自动合并

class Student
    def sayName name
        puts "my name is "+name
    end
end
class Student
    def sayAge age
        puts "my age is "+age.to_s
    end
end
Phi=Student.new
Phi.sayAge 18
Phi.sayName "Philippian"

my age is 18
my name is Philippian

7.1.2 嵌套类

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

class Student
    def sayName name
        puts "My name is "+name
    end
    class Homework
        def doHomework
            puts "I did my Homework"
        end
    end
end
he=Student.new
he.sayName "Philippian"
math=Student::Homework.new
math.doHomework

My name is Philippian
I did my Homework

7.1.3 特殊类

专门为某个对象添加的类

class Student
    def sayName name
        puts "My name is "+name
    end
end
he=Student.new
he.sayName "Philippian"
class <<he #特殊类
    def singSong song_name
        puts "I sang a song, its name is "+song_name
    end
end
he.singSong "我有一只小毛驴"

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

7.2 方法

7.2.1 默认参数

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

I am a Student
I want to have a holiday!

7.2.2 返回值

class Xiaoming
    def sayName
        "Xiaoming"
    end
    def sayAge
        return 19
    end
end
xiaoming=Xiaoming.new
puts xiaoming.sayName
puts xiaoming.sayAge.to_s

Xiaoming
19

7.2.3 特殊方法

class Student
    def sayName name
        puts "My name is "+name
    end
end
he=Student.new
he.sayName "Philippian"
def he.sayAge age #特殊方法
    puts "My age is "+age.to_s
end
he.sayAge 18

Xiaoming
19

7.2.4 类方法

class Student
    def Student.sayClass
        puts self.class
    end
end
Student.sayClass

Class

7.2.5 构造方法

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

class Student
    def initialize name,age
        @name=name
        @age=age
    end
    def show
        puts "My name is #{@name}, My age is #{@age}"
    end
end
he=Student.new "Philippian",19
he.show

My name is Philippian, My age is 19

7.3 变量与属性

7.3.1 实例变量

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

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

7.3.2 类变量

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

7.3.3 属性

属性设置器和读取器

class Student
    @university
    def setUniversity=(val)
        @university=val
    end
    def university
        @university
    end
end
he=Student.new
he.setUniversity="SYSU"
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 类的继承

class Animal
    def eat
        puts "I can eat"
    end
    def breathe
        puts "I can breathe"
    end
end
class Dog<Animal #继承
    def run #Dog类自己的方法
        puts "I am a dog, I can run"
    end
    def eat #重写父类的方法
        puts "I am a dog, I like eating bone"
    end
end
wangwang=Dog.new
wangwang.eat
wangwang.breathe
wangwang.run

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

访问父类构造方法

class Student
    def initialize (name, age)
        @name=name
        @age=age
    end
    def saySomething
        puts "I can say something"
    end
end
class UniversityStudent<Student
    def initialize stu_num
        @stu_num=stu_num
        super("Philippian", 18) #super关键字访问父类构造方法
    end
    def show
        puts "My name is #{@name}, my age is#{@age}, \nmy student numbe is #{@stu_num}"
    end
end
he=UniversityStudent.new 1111111111
he.saySomething
he.show

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

7.5 作用域

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

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

class Animal
    def eat #默认public
        puts "I can eat"
    end

    public #定义为公有方法
    def drink
        puts "I can drink"
    end

    private #定义为私有方法
    def breathe 
        puts "I can breathe"
    end

    protected #定义为保护方法
    def run
        puts "I can run"
    end
end

‘2. 使用参数指定成员

class Animal
    def eat
        puts "I can eat"
    end

    def run
        puts "I can run"
    end

    def breathe
        puts "I can breathe"
    end

    private(:eat) #定义为私有方法
    protected(:breathe,:run)#定义为保护方法
end

7.6 代码块

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

def saySomething
    puts "This is the 1st in method"
    yield
    puts "This is the 2nd in method"
end
saySomething do
    puts "This is in a block"
end

saySomething{
    puts "This is in a block too"
}

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

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


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • 查找给定字符串的所有不同回文子字符串原文:https://www ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
author-avatar
铥铥宇900
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有