1、变量
# -*- coding: UTF-8 -*- puts "hello world" name1 = "Joe" name2 = "Mary" puts "你好 #{name1}, #{name2} 在哪?" # 1、定义一个全局变量 $g_v = 10 # 定义一个类,类名必须以大写开头 class Class1 def test1 # 格式化,使用#号加变量名的方式 puts "全局变量的值为#$g_v" end end class Class2 def test1 puts "全局变量的值为#$g_v" end end # 实例化一个类,用new方法 c1 = Class1.new c2 = Class2.new # 实例调用实例方法,用点号 c1.test1 c2.test1 class Class3 # 这个就是构造方法,和python中的__init__方法是一样的 def initialize(id,name,add) @id = id # @符号来定义实例变量 @name = name @add = add end # ruby定义方法,如果该方法不需要传参,则可以没有这个括号,当然有也没错 def outputvalue() puts "id为#@id" # 在字符串中访问实例变量用#@加上变量名 puts "name为#@name" puts "add为#@add" end end # 初始化一个类的实例,这个类有构造方法,需要参数,这里要传参数去实例化一个类 c3 = Class3.new(1,"c3","sz") c3.outputvalue class Class4 # @@定义了一个类变量,我们这里的用途是统计这个类的实例个数 @@num = 0 def initialize(id,name,add) @id = id @name = name @add = add @@num += 1 # 因为类进行实例化必须要执行构造方法,所有我们在构造方法中对类变量进行加1的操作 end def num_of() puts "实例的数量为#@@num" end end c4_1 = Class4.new(1,"c4_1","sz1") c4_1.num_of c4_2 = Class4.new(2,"c4_2","sz2") c4_2.num_of class Class4 # 通过大写字母开头定义一个常量 VAR1 = 20 VAR2 = 30 def initialize(id,name,add) @id = id @name = name @add = add @@num += 1 # 因为类进行实例化必须要执行构造方法,所有我们在构造方法中对类变量进行加1的操作 end def num_of() puts "实例的数量为#@@num" end end print <
2、运算符
# 1、赋值运算符 a = 100 b = 200 c = 300 a,b = b,a d,e,f = 10,20,30 puts a puts d # 逻辑运算符 # test1 = a && d puts test1 test2 = a || d puts test2 test3 = !a puts test3 test4 = 1..10 test5 = 1...10 puts test4 puts test5 res = defined? test puts res
3、条件判断和循环
# if-elsif-else语句 x = 10 # 1、写法1,可以不写then if x > 1 puts "大于1" elsif x < 1 puts "小于1" else puts "等于1" end # 2、写法2,写then x = 10 if x > 1 then puts "大于1" elsif x < 1 then puts "小于1" else puts "等于1" end # 3、if修饰符 # code if condition # if修饰词组表示当 if 右边之条件成立时才执行 if 左边的式子。即如果 conditional 为真,则执行 code。 # # $g_v2 = 10 # print "debug\n" if $g_v2 puts "debug\n" if $g_v2 $g_v2 = nil print "debug\n" if $g_v2 # 4、unless,和if正好相反,如果不满足unless后面的条件,则执行该unless下面的语句 x=1 unless x>2 puts "x 小于 2" else puts "x 大于 2" end # unless修饰符 # code unless conditional 如果 conditional 为假,则执行 code。 $g_v2 = 10 # print "debug\n" if $g_v2 puts "debug1\n" unless $g_v2 $g_v2 = nil print "debug2\n" unless $g_v2 # 5、case语法,满足第一个条件之后,就不往下继续执行了,就会跳出case语法 $age = 5 case $age when 0 .. 2 puts "婴儿" when 1 .. 6 puts "小孩" when 1 .. 12 puts "child" when 13 .. 18 puts "少年" else puts "其他年龄段的" end # 6、循环语法 # # 语法1 $i = 0 $num = 5 while $i < $num puts("在循环语句中 i = #$i" ) $i +=1 end # 语法2 有个do,这个do可以省略 $i = 0 $num = 5 while $i < $num do puts("在循环语句中 i = #$i" ) $i +=1 end # 语法3 有个: 这个:和前面必须有空格 $i = 0 $num = 5 while $i < $num ; puts("在循环语句中 i = #$i" ) $i +=1 end # 语法4 while修饰符 $i = 0 $num = 5 begin puts("在循环语句中4 i = #$i" ) $i +=1 end while $i < $num # 7、until语法,不满足条件,则执行语句 $i = 0 $num = 5 until $i > $num do puts("在循环语句中 i = #$i" ) $i +=1; end # 8、for语法 for i in 0...5 puts "局部变量的值为 #{i}" end for i in 0..5 puts "局部变量的值为 #{i}" end # 9、break语法 for i in 0..5 if i > 2 then break end puts "局部变量的值为 #{i}" end # 10、next语法,相当于continue for i in 0..5 if i < 2 then next end puts "局部变量的值为1 #{i}" end # 11、redo语法,从头开始循环,如果满足条件,则从当前循环的条件开始,比如先打印0、1、2,然后i为3满足条件,则打印3,执行redo语句,i还是3,不会从0开始 for i in 0..5 if i > 2 puts "局部变量的值为2 #{i}" redo else puts "#{i}" end end
4、函数参数
# 方法 # 1、默认参数 # 定义一个方法,该方法有默认参数,所以调用的时候可以传参也可以不不传参 def test(a1="Ruby", a2="Perl") puts "编程语言为 #{a1}" puts "编程语言为 #{a2}" end test "C", "C++" test # 2、函数返回值 # 定义一个函数,返回值 def test i = 10 j = 100 k = 1000 return i,j,k end res = test puts res # 3、函数的可变参数 *args def sample (*args) puts "参数个数为 #{args.length}" for i in 0...args.length puts "参数值为 #{args[i]}" end end sample "Zara", "6", "F" sample "Mac", "36", "M", "MCA"
5、导入模块
# 从当前目录下导入模块 $LOAD_PATH << '.' require 'trig' require 'moral' # require 导入模块,可以省略rb # 模块名.方法名---->调用模块的方法 # 模块名;;变量名---->调用模块的变量 # y = Trig.sin(Trig::PI/4) puts y wrongdoing = Moral.sin(Moral::VERY_BAD) puts wrongdoing
6、在类中引入模块
$LOAD_PATH << '.' require "support" class Decade # 1、定义一个模块,在类中引入这个模块 include Week no_of_yrs=10 def no_of_months # ::使用引入模块中的变量 puts Week::FIRST_DAY number=10*12 puts number end def test_module # .使用引入的模块中的方法 Week.weeks_in_year end end d1=Decade.new puts Week::FIRST_DAY Week.weeks_in_month Week.weeks_in_year d1.no_of_months d1.test_module
模块的代码
module Week FIRST_DAY = "Sunday" def Week.weeks_in_month puts "You have four weeks in a month" end def Week.weeks_in_year puts "You have 52 weeks in a year" end end
7、字符串
# 字符串 # 定义一个字符串 name1 = "Joe" name2 = "Mary" # 定义一个字符串,用内建方法 name3 = String.new("hello") puts name3 # 字符串中引入变量 puts "你好 #{name1}, #{name2} 在哪?" x, y, z = 12, 36, 72 puts "x 的值为 #{ x }" puts "x + y 的值为 #{ x + y }" # 字符串引入表达式 puts "x + y + z 的平均值为 #{ (x + y + z)/3 }" s = "aAAAA" s = s.downcase puts s
8、数组
# 数组 # 创建一个没有大小限制的数组 names = Array.new # 创建一个容量为20的数组 names = Array.new(20) # 计算数组长度的2个方法 puts names.length puts names.size # 为数组中的每个元素赋值 names = Array.new(6,"mac") puts "#{names}" # 初始化数组的方式 names = Array.[](1,2,3,4,5,6) puts "#{names}" # 初始化数组的方式 names = Array[1,2,3,4,5,6] # 创建一个数字数组 names = Array(0..9) puts "#{names}" # 创建一个数字数组 names = Array(0...9) puts "#{names}"
9、hash
# hash就是一个k-v的集合,和python中的dict一样 # months = Hash.new # 创建一个hash H = Hash["a" => 100, "b" => 200, [1,"jan"] => "January"] # 获取hash的k对应的v puts "#{H['a']}" puts "#{H['b']}" puts "#{H[ [1,"jan"]]}" # 获取所有的keys puts "#{H.keys}" # 获取所有的values puts "#{H.values}" # 打印hash的值 puts "#{H}" # 为hash添加一个元素 H["c"] = "2b" puts "#{H.keys}" # 清空hash H.clear puts "#{H}"
10、时间模块
# 时间和日期 time = Time.new # 获取当前的时间 puts "当前时间为:" + time.inspect # 获取当前时间 puts "当前时间为:" + Time.now.inspect puts time.year # => 日期的年份 puts time.month # => 日期的月份(1 到 12) puts time.day # => 一个月中的第几天(1 到 31) puts time.wday # => 一周中的星期几(0 是星期日) puts time.yday # => 365:一年中的第几天 puts time.hour # => 23:24 小时制 puts time.min # => 59 puts time.sec # => 59 puts time.usec # => 999999:微秒 puts time.zone # => "UTC":时区名称
11、范围
# 范围 Range # # # 范围(Range)无处不在:a 到 z、 0 到 9、等等。Ruby 支持范围,并允许我们以不同的方式使用范围: # # 作为序列的范围 # 作为条件的范围 # 作为间隔的范围 # 这个只能正序排列,倒序不行,倒序是空 range1 = (1..10).to_a range2 = (1...10).to_a range3 = ("a".."f").to_a range4 = ("a"..."f").to_a range5 = ("bat"..."bay").to_a # to_a方法,把一个范围转换为列表 puts "#{range1}" puts "#{range2}" puts "#{range3}" puts "#{range4}" puts "#{range5}" # 循环 range1.each do |r| puts "#{r}" end # 过滤出不符合条件的 res = range1.reject{|r| r < 5} puts "#{res}" # 作为条件范围 score = 70 result = case score when 0..40 "糟糕的分数" when 41..60 "快要及格" when 61..70 "及格分数" when 71..100 "良好分数" else "错误的分数" end puts result # 作为一个间隔的范围 if ((1..10) === 5) puts "5 在 (1..10)" end if (('a'..'j') === 'c') puts "c 在 ('a'..'j')" end if (('a'..'j') === 'z') puts "z 在 ('a'..'j')" end
12、each
# 迭代器 # each迭代器 ary = [1,2,3,4,5] ary.each do |i| puts i end h = Hash("a" => "aa","b" => "bb","c" => "cc") h.each do |i| puts i end a = [1,2,3,4,5] b = Array.new b = a.collect{ |x|x } puts b
13、文件操作
# 文件的输入和输出 # puts 语句 val1 = "This is variable one" val2 = "This is variable two" puts val1 puts val2 # gets 语句,获取用户的输入 # puts "Enter a value :" val = gets puts val # putc语句,一次输出一个字符 putc val1 # print和puts的方法类似,但是print不会换行,而puts会换行 print "Hello World" print "Good Morning" # 打开和关闭文件 # # # 读文件 afile = File.open("moral.rb","r") if afile res = afile.sysread(100) puts res else puts "error" end # 写文件 aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") else puts "Unable to open file!" end