目录
基本例子
输出一个带变量的字符串
character_name = "john"
puts "name is " + character_name
结果:
name is john
2.print和puts的区别
连续输入两次print输出结果不换行,puts会换行
3.真值,假值和空值
ismale = true
isfmale = false
isnone = nil
字符串操作
a = "Zk \nAcadamy" #换行
puts a
#Zk
#Acadamy
a = "Zk Acadamy" #转大写
puts a.upcase()
#ZK ACADAMY
a = "Zk Acadamy" #转小写
puts a.downcase()
#zk acadamy
a = " Zk Acadamy " #删除空格
puts a.strip()
#Zk Acadamy
a = " Zk Acadamy " #统计字符个数
puts a.length()
#23
a = "Zk Acadamy" #检测是否包含特定字符串
puts a.include?"Acadamy"
puts a.include?"Acadamys"
#true
#false
a = "Zk Acadamy" #索引查找
puts a[0]
puts a[0,3]
puts a.index("Aca")
puts a.index("Ace")
#Z
#Zk
#3
#(空nil)
数值操作
puts 5 + 9
puts 5 - 9.5
puts 2*3
puts 2**3 #2的三次方
puts 2/3
puts 2%3
num = -20
puts num.abs()
num = 20.456 #四舍五入
puts num.round()
数值转换
num = 10 # 数字转字符串
str = num.to_s
# "10"
str = "10" # 字符串转整数
num = str.to_i
# 10
str = "10.5" # 字符串转浮点数
num = str.to_f
# 10.5
str = "hello" # 如果字符串不能被解析为一个有效的数字,to_i和to_f方法将返回0:
num = str.to_i
# 0
num = str.to_f
# 0.0
数组
friends = Array["Amy","Bob","Catte","Andy"]
print friends ,"\n"
print friends.reverse() #对数组反向
print friends.sort() #对数组排序
哈希(python中的字典)
实际上就是key value的关系
states = {
"Pennsylvania" => "PA",
"New York" =>"NY",
"Oregon" => "OR"
}
puts states["Oregon"] #OR
方法(函数)
def sayhi(name)
puts ("hello user " + name)
end
sayhi("Mike") #hello user Mike
I/O和流控制
if语句
ismale = true
istall = false
if ismale and istall
puts "you are male and tall"
elsif !ismale and !istall
puts "you are not male and not tall"
else
puts "you are not male"
end
循环
while语句
index = 1
while index<=5
puts index
index +=1
end
until 语句
index = 1
until index>=5
puts index
index +=1
end
for 语句
# for循环
for i in 1..5
puts i
end
unless语句
index = 1
unless index >=5
puts index
index +=1
end
each循环
(1..5).each do |i|
puts i
end
文件的操作
打开并读取文件
file = File.open("example.txt", "r") #"r" 表示以只读模式打开文件。
contents = file.read
puts contents
file.close
写入文件
file = File.open("example.txt", "w") #"w" 表示以写模式打开文件(如果文件已存在,将覆盖该文件)。
file.puts "Hello, Ruby!"
file.close
追加内容到文件
file = File.open("example.txt", "a")#"a" 表示以追加模式打开文件(不会覆盖现有内容,而是添加新内容)
file.puts "New line of text!"
file.close
逐行读取文件
File.foreach("example.txt") { |line| puts line }
重命名文件
File.rename("old_name.txt", "new_name.txt")
删除文件
File.delete("example.txt") if File.exist?("example.txt")
获取文件的详细信息
file_info = File.stat("example.txt")
puts file_info.size # 文件大小
puts file_info.mtime # 文件的最后修改时间
检查文件是否存在
if File.exist?("example.txt")
puts "文件存在。"
else
puts "文件不存在。"
end
异常处理
简单处理异常例子
begin
# 可能会引发异常的代码
result = 10 / 0
puts result
rescue ZeroDivisionError => e
# 处理 ZeroDivisionError 异常
puts "捕获到除以零的错误:#{e.message}"
end
puts "程序继续运行..."
begin 和 rescue 包围了可能会引发异常的代码块。
当遇到 ZeroDivisionError(除以零错误)时,rescue 捕获这个错误并执行相应的代码。
即使发生异常,程序也会继续执行后续的代码。
捕获多种异常
begin
file = File.open("non_existent_file.txt")
result = 10 / 0
rescue ZeroDivisionError
puts "除以零错误。"
rescue Errno::ENOENT
puts "文件未找到。"
end
puts "程序继续运行..."
捕获所有异常
begin
# 可能会引发各种异常的代码
rescue => e
puts "发生了一个错误:#{e.message}"
end
类
一个通常类
class Person
# 初始化方法(构造函数),用于设置对象的初始属性
def initialize(name, age)
@name = name # 实例变量
@age = age
end
# 读取名称的方法
def name
@name
end
# 设置名称的方法
def name=(new_name)
@name = new_name
end
# 打印问候语的方法
def greet
puts "你好,我叫 #{@name},今年 #{@age} 岁。"
end
end
# 创建 Person 类的实例
person = Person.new("张三", 30)
person.greet # 输出:你好,我叫 张三,今年 30 岁。
person.name = "李四"
person.greet # 输出:你好,我叫 李四,今年 30 岁。
initialize 方法是 Ruby 中的构造函数,当使用 Person.new 创建对象时会自动调用这个方法。
@name 和 @age 是实例变量,属于对象的属性。
name 和 name= 是访问器方法,用来获取和设置 @name 的值。
greet 是一个普通的方法,用于输出自我介绍信息。
使用 attr_accessor 简化属性访问
class Person
attr_accessor :name, :age #attr_accessor 会自动生成 name 和 age 的 getter 和 setter 方法,因此我们不需要手动定义它们。
def initialize(name, age)
@name = name
@age = age
end
def greet
puts "你好,我叫 #{@name},今年 #{@age} 岁。"
end
end
person = Person.new("张三", 30)
puts person.name # 输出:张三
person.name = "李四"
puts person.name # 输出:李四
类的继承
Student 类继承了 Person 类,并扩展了它的功能
class Person
attr_accessor :name, :age
def initialize(name, age)
@name = name
@age = age
end
def greet
puts "你好,我叫 #{@name},今年 #{@age} 岁。"
end
end
class Student < Person
def initialize(name, age, grade)
super(name, age) # 调用父类的初始化方法
@grade = grade
end
def study
puts "#{@name} 正在学习。"
end
def greet
super # 调用父类的 greet 方法
puts "我是一名 #{@grade} 年级的学生。"
end
end
student = Student.new("王五", 18, 12)
student.greet # 输出:你好,我叫 王五,今年 18 岁。我是一名 12 年级的学生。
student.study # 输出:王五 正在学习。
Student 类继承了 Person 类,使用 < 符号实现继承。
super 关键字调用了父类的 initialize 和 greet 方法,避免重复编写代码。
Student 类新增了 study 方法,并对 greet 方法进行了扩展。
类方法(静态方法)
类方法属于类本身,而不是类的实例。可以使用 self 来定义类方法。
class MathUtil
# 定义一个类方法,用于计算两个数的和
def self.add(a, b)
a + b
end
end
result = MathUtil.add(5, 3)
puts result # 输出:8
self.add 定义了一个类方法,可以通过 MathUtil.add 来直接调用,而不需要实例化对象
类的常量
类中可以定义常量,通常用来表示一些不变的值
class Circle
PI = 3.14159 # 定义常量
def initialize(radius)
@radius = radius
end
def area
PI * @radius * @radius
end
end
circle = Circle.new(10)
puts circle.area # 输出:314.159
PI 是一个常量,在类中使用大写字母表示。
常量的值在整个类中可以被引用,且一般不会改变。
类的继承和方法重写
如果子类需要修改父类中的某些方法,可以进行方法重写。可以通过 super 调用父类中的原方法,也可以选择完全重写它。
class Animal
def speak
puts "动物发出声音"
end
end
class Dog < Animal
def speak
puts "汪汪汪" # 重写父类的 speak 方法
end
end
dog = Dog.new
dog.speak # 输出:汪汪汪
子类 Dog 重写了父类 Animal 的 speak 方法,定义了自己的行为。