Ruby方法定义 #
一、方法概述 #
方法是Ruby中组织代码的基本单元,用于封装可重用的代码块。
二、定义方法 #
2.1 基本语法 #
ruby
def greet
puts "Hello, Ruby!"
end
greet
2.2 带参数的方法 #
ruby
def greet(name)
puts "Hello, #{name}!"
end
greet("Ruby")
greet "Ruby"
2.3 多参数方法 #
ruby
def add(a, b)
a + b
end
add(1, 2)
add 1, 2
2.4 返回值 #
ruby
def add(a, b)
return a + b
end
def add(a, b)
a + b
end
def add(a, b)
result = a + b
result
end
2.5 多返回值 #
ruby
def min_max(arr)
[arr.min, arr.max]
end
min, max = min_max([3, 1, 4, 1, 5, 9])
三、方法命名 #
3.1 命名规则 #
ruby
def valid_name
end
def valid_name?
end
def dangerous_method!
end
def setter=(value)
end
def _private_method
end
3.2 后缀含义 #
| 后缀 | 含义 | 示例 |
|---|---|---|
| ? | 谓词方法,返回布尔值 | empty? |
| ! | 危险方法,修改原对象 | sort! |
| = | 赋值方法 | name= |
ruby
def even?(n)
n % 2 == 0
end
def sort!(arr)
arr.sort!
end
def name=(value)
@name = value
end
四、方法调用 #
4.1 基本调用 #
ruby
greet
greet()
greet("Ruby")
greet "Ruby"
4.2 链式调用 #
ruby
"hello".upcase.reverse
[1, 2, 3].map(&:to_s).join("-")
4.3 安全调用 #
ruby
user&.name
user&.profile&.avatar
4.4 send调用 #
ruby
"hello".send(:upcase)
"hello".send(:+, " world")
"hello".public_send(:upcase)
五、方法对象 #
5.1 method方法 #
ruby
method(:puts)
method(:puts).call("Hello")
method(:puts)["Hello"]
5.2 to_proc #
ruby
:upcase.to_proc
["a", "b", "c"].map(&:upcase)
5.3 方法作为参数 #
ruby
def apply(value, func)
func.call(value)
end
apply("hello", method(:upcase))
apply("hello", ->(s) { s.reverse })
六、方法可见性 #
6.1 public #
ruby
class Person
def greet
"Hello!"
end
end
Person.new.greet
6.2 private #
ruby
class Person
def initialize(name)
@name = name
end
def introduce
"Hello, I'm #{name}"
end
private
def name
@name
end
end
person = Person.new("Ruby")
person.introduce
person.name
6.3 protected #
ruby
class Person
def initialize(age)
@age = age
end
def older_than?(other)
age > other.age
end
protected
def age
@age
end
end
alice = Person.new(30)
bob = Person.new(25)
alice.older_than?(bob)
七、类方法 #
7.1 定义类方法 #
ruby
class Person
def self.create(name)
Person.new(name)
end
class << self
def count
@@count
end
end
end
Person.create("Ruby")
7.2 调用类方法 #
ruby
Person.create("Ruby")
Person::create("Ruby")
八、实用示例 #
8.1 工具方法 #
ruby
def present?(value)
!value.nil? && value != "" && value != []
end
def blank?(value)
!present?(value)
end
def presence(value)
value if present?(value)
end
8.2 验证方法 #
ruby
def valid_email?(email)
email.match?(/\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i)
end
def valid_phone?(phone)
phone.match?(/\A\d{11}\z/)
end
8.3 转换方法 #
ruby
def to_boolean(value)
case value
when true, "true", "1", 1 then true
when false, "false", "0", 0 then false
else nil
end
end
def to_snake_case(str)
str.gsub(/([A-Z])/, '_\1').downcase.gsub(/^_/, '')
end
def to_camel_case(str)
str.split('_').map(&:capitalize).join
end
8.4 缓存方法 #
ruby
def memoize(name)
define_method(name) do |*args|
cache = instance_variable_get("@_#{name}_cache") || {}
instance_variable_set("@_#{name}_cache", cache)
cache[args] ||= super(*args)
end
end
九、最佳实践 #
9.1 方法长度 #
ruby
def process(data)
return unless valid?(data)
transformed = transform(data)
saved = save(transformed)
notify(saved)
end
def valid?(data)
data && !data.empty?
end
def transform(data)
data.map(&:upcase)
end
9.2 单一职责 #
ruby
def create_user(params)
user = build_user(params)
validate_user(user)
save_user(user)
send_welcome_email(user)
user
end
9.3 有意义的命名 #
ruby
def calculate_total_price(items)
items.sum { |item| item.price * item.quantity }
end
def apply_discount(total, discount_percent)
total * (1 - discount_percent / 100.0)
end
十、总结 #
本章我们学习了:
- 定义方法:def关键字、参数、返回值
- 方法命名:规则、后缀含义
- 方法调用:基本调用、链式调用、安全调用
- 方法对象:method、to_proc
- 方法可见性:public、private、protected
- 类方法:self、class << self
接下来让我们学习Ruby的方法参数!
最后更新:2026-03-27