آرگومان‌های متد در روبی

آرگومان‌های موقعیتی، پیش‌فرض، کلیدواژه‌ای و splat (*args, **kwargs) در روبی

انواع آرگومان در روبی

روبی چندین نوع آرگومان برای متدها پشتیبانی می‌کند.

۱. آرگومان‌های موقعیتی (Positional)

ساده‌ترین نوع — به ترتیب داده می‌شوند:

def greet(first_name, last_name)
  "سلام #{first_name} #{last_name}!"
end

puts greet("علی", "رضایی")  # => سلام علی رضایی!

۲. آرگومان‌های پیش‌فرض (Default)

اگر آرگومان داده نشود، مقدار پیش‌فرض استفاده می‌شود:

def greet(name = "کاربر")
  "سلام #{name}!"
end

puts greet          # => سلام کاربر!
puts greet("علی")   # => سلام علی!
آرگومان‌های پیش‌فرض باید بعد از آرگومان‌های اجباری بیایند.

۳. آرگومان‌های کلیدواژه‌ای (Keyword Arguments)

آرگومان‌ها با نام مشخص می‌شوند — ترتیب مهم نیست:

def create_user(name:, age:, city: "تهران")
  "#{name}، #{age} ساله، ساکن #{city}"
end

puts create_user(name: "علی", age: 25)
puts create_user(age: 30, name: "مریم", city: "اصفهان")

کلیدواژه‌ای با پیش‌فرض

def configure(host:, port: 8080, debug: false)
  "Host: #{host}, Port: #{port}, Debug: #{debug}"
end

puts configure(host: "localhost")
puts configure(host: "localhost", port: 3000, debug: true)

۴. Splat (*args) — تعداد متغیر

برای تعداد متغیر آرگومان موقعیتی:

def sum_all(*numbers)
  numbers.sum
end

puts sum_all(1, 2, 3)        # => 6
puts sum_all(1, 2, 3, 4, 5)  # => 15
puts sum_all                 # => 0

ترکیب splat با آرگومان عادی

def greet_all(greeting, *names)
  names.map { |n| "#{greeting} #{n}!" }
end

puts greet_all("سلام", "علی", "مریم", "حسن").inspect
# => ["سلام علی!", "سلام مریم!", "سلام حسن!"]

۵. Double Splat (**kwargs) — کلیدواژه‌های متغیر

def log(message, **options)
  puts "Message: #{message}"
  options.each { |k, v| puts "  #{k}: #{v}" }
end

log("خطا رخ داد", level: "error", code: 500, time: Time.now)

۶. بلوک به عنوان آرگومان (&block)

def run_block(&block)
  block.call
end

run_block { puts "این یک بلوک است!" }

# یا با yield
def run_yield
  yield
end

run_yield { puts "با yield!" }

ترکیب همه انواع

def complex_method(a, b, *rest, keyword:, optional: 42, **kwargs, &block)
  puts "a: #{a}"
  puts "b: #{b}"
  puts "rest: #{rest.inspect}"
  puts "keyword: #{keyword}"
  puts "optional: #{optional}"
  puts "kwargs: #{kwargs.inspect}"
  block.call if block
end

complex_method(1, 2, 3, 4, 5, keyword: "required", extra: "data") {
  puts "بلوک!"
}

آرگومان‌های نام‌گذاری‌شده قدیمی (Hash)

# سبک قدیمی با Hash
def old_style(options = {})
  name = options[:name] || "ناشناس"
  age = options[:age] || 0
  "#{name}، #{age} ساله"
end

puts old_style(name: "علی", age: 25)

خلاصه

نوعسینتکسمثال
موقعیتی(a, b)f(1, 2)
پیش‌فرض(a = 1)f() یا f(5)
کلیدواژه‌ای(name:)f(name: "علی")
کلیدواوده با پیش‌فرض(port: 80)f() یا f(port: 443)
Splat(*args)f(1, 2, 3)
Double Splat(**kwargs)f(a: 1, b: 2)
بلوک(&block)f { ... }

این مبحث بخشی از دوره آموزش کامل روبی است.

ابزارهای مرتبط