Ruby 方法
在 Ruby 中,方法(method)是执行特定任务的代码块,可以被重复调用。以下是对 Ruby 方法的中文讲解,涵盖定义、调用、参数、返回值等关键内容,力求简洁清晰。
1. 方法定义
Ruby 使用 def
关键字定义方法,end
结束定义。
# 语法
def 方法名(参数1, 参数2, ...)
# 代码块
返回值 # 可选,最后一行默认返回
end
# 示例
def say_hello
puts "Hello, World!"
end
说明:
- 方法名通常用小写字母和下划线(如
say_hello
)。 - 方法的最后一行表达式会自动作为返回值,无需显式
return
(但可以用)。
2. 调用方法
直接使用方法名调用,参数放在括号中(括号可省略)。
# 定义
def greet(name)
"Hello, #{name}!"
end
# 调用
puts greet("Alice") # 输出:Hello, Alice!
puts greet "Bob" # 输出:Hello, Bob!(省略括号)
3. 参数
Ruby 方法支持多种参数类型:
- 普通参数:
def add(a, b)
a + b
end
puts add(2, 3) # 输出:5
- 默认参数:为参数设置默认值,调用时可省略。
def greet(name = "Guest")
"Hello, #{name}!"
end
puts greet # 输出:Hello, Guest!
puts greet("Alice") # 输出:Hello, Alice!
- 可变参数(*splat):接收任意数量的参数,存为数组。
def sum(*numbers)
numbers.sum
end
puts sum(1, 2, 3) # 输出:6
puts sum(10) # 输出:10
- 关键字参数:用键值对传递参数,顺序无关。
def introduce(name:, age:)
"I'm #{name}, #{age} years old."
end
puts introduce(name: "Alice", age: 25) # 输出:I'm Alice, 25 years old.
- 默认关键字参数:
def introduce(name: "Guest", age: 18)
"I'm #{name}, #{age} years old."
end
puts introduce(age: 20) # 输出:I'm Guest, 20 years old.
4. 返回值
- Ruby 方法默认返回最后一行表达式的值。
- 可使用
return
显式返回值,立即退出方法。
def square(num)
return num * num # 显式返回
puts "这行不会执行"
end
puts square(4) # 输出:16
5. 块与 yield
方法可以与块(block)一起使用,通过 yield
调用块。
def repeat(n)
n.times { yield }
end
repeat(3) { puts "Hello!" }
# 输出:
# Hello!
# Hello!
# Hello!
说明:yield
执行传入的块,块用 do...end
或 {}
定义。
- 检查块是否存在:用
block_given?
避免错误。
def try_yield
if block_given?
yield
else
"No block given."
end
end
puts try_yield { "Block!" } # 输出:Block!
puts try_yield # 输出:No block given.
6. 方法作用域
- 方法定义在类/模块中或顶层(全局可用)。
- 方法默认是
public
,可通过private
或protected
限制访问。
class Person
def public_method
puts "This is public."
end
private
def private_method
puts "This is private."
end
end
person = Person.new
person.public_method # 输出:This is public.
# person.private_method # 错误:private method
7. 常见内置方法
Ruby 提供许多内置方法,如:
puts
:打印输出,自动换行。print
:打印输出,不换行。p
:打印对象并返回,适合调试。gets
:获取用户输入。
p "Hello" # 输出:"Hello"(带引号,调试用)
8. 方法别名与重定义
- 别名:用
alias
为方法创建别名。
def say
"Hello"
end
alias say_hello say
puts say_hello # 输出:Hello
- 重定义:可以重新定义已有方法(需谨慎)。
class String
def upcase
"Custom: #{self}"
end
end
puts "test".upcase # 输出:Custom: test
9. 注意事项
- 方法名后加
?
表示返回布尔值(如empty?
)。 - 方法名后加
!
表示可能修改对象(如upcase!
)。 - Ruby 方法灵活,优先简洁性和可读性。
- 避免方法名与 Ruby 关键字冲突(如
class
,def
)。
如果你有具体问题或需要更详细的示例,请告诉我!