def là keyword — tên method phải là identifier tĩnh biết lúc viết code. define_method là method nhận tên động (string/symbol), cho phép tạo method theo pattern lúc runtime.
ruby
class Status
STATES = %i[pending active suspended]
STATES.each do |state|
define_method("#{state}?") do
@state == state
end
define_method("#{state}!") do
@state = state
end
end
end
obj = Status.new
obj.active! # setter
obj.active? # => true
obj.pending? # => falseKhi dùng define_method:
- Sinh nhiều method theo pattern (tránh copy-paste).
- Tên method đến từ data (symbol array, config...).
- Cần closure (capture biến từ scope tạo method).
define_method + block là closure, còn def thì không capture biến ngoài.