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 <<EOF
AAAA
BBB
CCC
DDD
EOF
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
" if $g_v2
puts "debug
" if $g_v2
$g_v2 = nil
print "debug
" 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
" if $g_v2
puts "debug1
" unless $g_v2
$g_v2 = nil
print "debug2
" 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