大家好,欢迎来到IT知识分享网。
目录
记录Ruby的第一次学习
一、基本操作
(1)打印
puts:打印后自动换行
print:不会自动换行
(2)反斜杠转义
puts "\"" #输出"
(3)读取输入
使用gets方法获取输入
使用chmod来消除内容自动换行,即gets.chmod()
print "enter: " name = gets #使用gets获取输入 puts("Hello " + name + "you are 2b") #会自动把后面的内容换行 print "enter again: " name_new = gets.chomp() #消除自动换行!!! puts("Hello " + name_new + "! you are 2b") #不换行
(4)注释
1.使用#进行注释
2.使用=begin,=end进行注释(等号前面不能有空格),两个=开头的行之间会被注释
#单行注释 #puts test 不会打印 #多行注释 =begin 使用等号(前面不能有空格)进行注释 puts test 不会打印 =end
二、数据类型与应用
(1)基本数据类型
常用的数据类型为字符串,num(整数,浮点数),其基本用法如下:
1.使用puts进行打印的时候,最好加括号(可读性更高)
2.拼接方式为“string content” + var
3.也可以使用字符串格式化进行打印
注:拼接操作必须为字符串,若为其他类型,需要进行类型转换
name = "Believe" #字符串 age = 20 #整形 gpa = 3.2 #浮点型 nothis = nil #类似python中的None # puts ("try print" + nothis) # if (nothis == nil) puts ("gpa is %s"%gpa) puts ("age is %s"%age)#数值不能拼接,需要用字符串格式化 puts ("age is " + age.to_s)#使用.to_s puts "%s is beautiful"%name puts (name + " is beautiful")#字符串拼接 puts "Her name is "+name puts ("Her name is "+name) #可加括号
字符串类型的常用操作
length:计算长度
include?”string”:该字符串是否包含string这个字符(串)
切片:用逗号 “,” 连接
index:找出对应元素的索引
upcase:转大写
phase = "main phase" puts phase.length() #长度包括空格 puts phase.include?"main" #某字符是否在当前字符串中->T or F puts phase[0,3] #索引访问元素,0-based,切片用逗号,访问,不包括末尾 puts phase.index("a",2) #找出对应元素的索引(默认找出第一个),参数("str",start-index) puts phase.upcase() #转大写
num类型的常用操作
abs:取绝对值
round:取整
num = 20 numcontrast = -20 numfloat = 20.687 puts num % 3 puts ("-20's abs: " + numcontrast.abs().to_s) #abs puts ("20.687's round: " + num.round().to_s) #取整 puts ("num is " + num.to_s) #num2str,使用.to_s puts ("log2(2): " + Math.log2(2).to_s) #内置关键字进行计算 puts ("1.0+7: " + (1.0 + 7).to_s) #float calculate with int -> float
注:采用gets方法获取num的输入,需要进行类型转换才能成功计算
print "enter num1: " num1 = gets.chomp() print "enter num2: " num2 = gets.chomp() puts("num1 + num2: " + (num1 + num2))#会出现1+2=12 -> gets会把输入变成str puts("num1 + num2: " + (num1.to_i + num2.to_i).to_s)#类型转换 puts("1+1="+(1+1).to_s)#直接计算不需要to_i进行转换,打印1+1=2
字符串拼接/格式化
对字符串进行拼接/格式化有三种方法
直接用””和+进行拼接
使用%进行字符串格式化
使用#{}
name = 1 puts("a:"+name.to_s) puts("a:%s"%name) puts("a:#{name}")
(2)数据类型转换
通用格式为var.to_xx,主要有以下5种转换
num = 2 to_c:to complex复数 -> 2+0i to_r:to fraction分数 -> 2/1 to_f:to float -> 2.0 to_i:to int -> 2 to_s:to str -> 2
(3)其它数据类型
array(类似列表)
创建形式有三种:
1.有元素:xx=Array[xx]
2.有元素:xx=[xx]
3.创建空array:xx=Array.new
array通过索引对元素进行访问,可以有空白元素
常用方法有length()、include?、reverse、sort等
friends = Array[2,'pig','dragon','bird',1] puts friends puts friends[1] #索引访问 friends_unknow = Array.new #创建未知array friends_unknow[0] = 'dog' #赋值 friends_unknow[5] = 'cat' #赋值 puts friends_unknow #中间空缺的为空白 puts friends_unknow.length() #元素数量 puts friends_unknow.include?"dog" #是否包含元素 -> T or F puts friends_unknow.reverse()#翻转 numss = [1,2,4,3] puts numss.sort() #排序
哈希hash(类似字典)
其基本形式如下,使用箭头表示附属关系
states = { 3 => 1, "b" => 2 } puts states puts states['b'] #访问字符'b'对应的value puts states[3] #访问3对应的value
三、控制流
(1)条件控制语句
if
基本格式为:if…elsif…else…end(注意是elsif)
使用and表示逻辑与
结尾要有end
if elsif else ismale = false if ismale puts "man" elsif 2 > 1 and 3 > 2 #elsif #多条件,用and puts "num compare" else puts "none" end #要有end
case
使用case和when、else组合,else类似default的作用
结尾要有end
def get_day_name(day) day_name = "" case day when "mon" #when与case搭配。需要end day_name = "Monday" when "tue" day_name = "Tuesday" else day_name = "Invalid" #等同于default end puts day_name end get_day_name("")
(2)循环语句
while
基本形式为while…end
index = 1 while index <= 5 puts index index += 1 end
for
基本形式为for…end
friends = ['mike','chenjie','john'] for friend in friends1 puts friend end
指定次数遍历(类似python的range)
注:与range不同,尾元素也会被包括进来
for i in 1..5 #使用..进行连接头尾 puts i end #输出 #1 #2 #3 #4 #5
each
基本形式为.each…do…end
注:do后面可省略,即当不需要子元素用于后续计算,则可以省略(见times中cal_pow)
friends = ['mike','chenjie','john'] friends.each do |friend| #被遍历对象使用.each,每个子元素使用||表示 puts friend end
times
基本形式为.times…do…end
6.times do |i| #表示循环6次,从0开始 puts i end
与for、each等循环结构相比,times可以指定次数,当作为函数的参数进行传递时更加方便,如计算幂次方
def cal_pow(base_num,pow_num) result = 1 pow_num.times do #|index|可省略 result = result * base_num end puts result end cal_pow(2,3) #输出8
四、函数
函数定义及基本使用
基本格式为def…end
可带默认参数
可以array的形式返回全部值,也可以分别返回多个值
def sayhi #可不加括号 puts "Hello!" end #要加end sayhi def sayhi_param(data="no name") #参数化,默认值 puts ("Hello!" + data) return 1,2 #return返回值 end #要加end data = 'sb' return_val = sayhi_param(data) puts return_val[1] #多个值可像数组一样访问,或返回多个值 val1,val2 = sayhi_param(data) #这里rerurn_val等于val1,val2的集合
五、IO
文件读写
基本形式:File.open(“filename”,”Mode”)
分为块形式和非块形式
其Mode如下
文件读
按行读取方式有三种:read,readline,readlines
read:一次性去读全部内容,不可遍历
readline:读取单行
readlines:读取全部内容,作为array,可遍历
按字符读取:readchar
注:文件只能读取一次,当使用read读取文件后,指针已经跳转到文件末尾,后续的读取无效
块形式
注:自动关闭文件
File.open("a.txt","r") do |file| #第一段程序,读取了file,因此后续的代码全部读取 puts file.read() #第二段程序,因为指针到了文件尾部,所以读取不到内容,会输出false puts file.read().include? "bb" #第三段程序,读取失败 puts file.readline() #第四段程序,读取失败 puts file.readlines() end File.open("a.txt","r") do |file| content = file.read()#使用content对读取内容进行存储 puts content puts content.include? "bb"#输出ture #不会继续输出,因为已经读取过了 puts file.readline() puts file.readlines() end
非块形式
注:需要加上file.close()手动关闭文件
file = File.open("a.txt","r") content = file.readlines() for i in content puts i end file.close()
文件写
以块形式为例,使用write完成写入操作,可以结合readchar、readline等完成特定位置的写入
File.open("a.txt","r+") do |file| file.readchar() file.write("Mike") end
六、异常处理
使用异常处理,当执行到可能发生错误的语句时,可以使用其它提示语句代替它,类似python的try…expect
基本形式为 begin…rescue…end
多个rescue语句只会响应第一个
#可能的错误语句卸载begin和rescue之间 begin puts 10/0 rescue #替换语句卸载rescue和end之间 puts "0 can not be divide" end
可以指定抛出的错误类型,如ZeroDivisionError、TypeError等,它们自带提示语句
可以将错误赋予变量,通过打印变量,实现自动提示
#可能的错误语句在begin和rescue之间 num = [1,2] begin puts 10/0 #该语句会触发ZeroDivisionError num1 = num['dog'] #若仅存在该语句,则由于rescue指定了抛出错误类型,因此puts语句不会执行 rescue ZeroDivisionError #替换语句在rescue和end之间 puts "0 can not be divide" rescue TypeError => e#同理,该错误类型只会响应num1 = num['dog'] #puts "num has not element as string" puts e #输出no implicit conversion of String into Integer end
七、类
(1)声明和创建
基本形式为class…end(不用冒号)
类的属性使用attr_accessor来声明,搭配冒号和,第一个冒号前要有空格
类的创建使用new完成
使用object.attribute完成调用和赋值
注:Ruby类名开头必须大写!!!
class Building attr_accessor :name, :country, :people end build1 = Building.new() build1.name="one" build1.country="CHINA" build1.people="Chinese" puts build1.name
使用initialize对属性进行初始化,new的时候传参
使用@开头给属性赋值
对方法的调用也用点.实现
class Building attr_accessor :name, :country, :people def initialize(name,country,people) #初始化 @name = name #传递值 @country = country @people = people end def find_country() if @country == "CHINA" puts "Best Country" else puts "None" end end end build1 = Building.new("one","CHINA","Chinese") #传参 # build1.name="one" # build1.country="CHINA" # build1.people="Chinese" puts build1.people build1.find_country() #调用方法
(2)类的继承
使用<进行类的继承
class Example def print_test() puts "test" end end class New_example < Example #类继承 end exp = New_example.new() exp.print_test()
八、Module(打包)
module是类、方法、常量的集合
module名也必须以大写字母开头
module可以嵌入到类中
其中的常量开头要大写
module Module_Name class def Var #开头大写 end
(1)模块的导入
同模块导入之include
在同个文件中导入module,只需要include
module My_module def print_test() puts "test" end end include My_module puts My_module.print_test()
跨文件导入之require_relative、include
relative指相对路径
#文件test.rb module My_module def print_test() puts "test" end end #文件import.rb require_relative "test.rb" include My_module
(2)调用类、方法和常量
使用module.def来调用方法
使用module::var来调用常量
使用module::class来声明类
module My_module def print_test() puts "test" end Val = 1 end include My_module puts My_module.print_test() puts My_module::Val
module中声明类
module My_module class Print_test def print_test() puts "test" end end Val = 1 end include My_module # puts My_module::Print_test.print_test() puts My_module::Val inst_print = My_module::Print_test.new() inst_print.print_test()
(3)在类中嵌入Module
在类中嵌入Module,类可以等同于该Module,直接调用Module内嵌的元素
class Insert_Module include My_module end puts Insert_Module::Val
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/117002.html
