Tôi thấy mình liên tục viết những gì tôi thấy là mã không cần thiết trong Ruby khi sử dụng các đối số được đặt tên cho các phương thức.Đối số được đặt tên làm biến cục bộ trong Ruby
Đưa ví dụ đoạn mã sau:
def my_method(args)
orange = args[:orange]
lemon = args[:lemon]
grapefruit = args[:grapefruit]
# code that uses
# orange, lemon & grapefruit in this format which is way prettier & concise than
# args[:orange] args[:lemon] args[:grapefruit]
puts "my_method variables: #{orange}, #{lemon}, #{grapefruit}"
end
my_method :orange => "Orange", :grapefruit => "Grapefruit"
Những gì tôi thực sự không thích về mã này là tôi phải lấy args và vượt qua các giá trị vào các biến địa phương đi ngược lại nguyên tắc DRY và chỉ thường chiếm không gian trong các phương pháp của tôi. Và nếu tôi không sử dụng các biến cục bộ và chỉ tham chiếu đến tất cả các biến với cú pháp args [: symbol] thì mã đó sẽ trở nên hơi không đọc được.
Tôi đã cố gắng giải quyết vấn đề này nhưng vẫn giữ được bức tường gạch vì tôi không biết cách xác định biến cục bộ bằng cách sử dụng eval trong phạm vi của phương thức hoặc sử dụng bất kỳ kỹ thuật nào khác. Đây là một trong nhiều nỗ lực dưới đây, mà kết quả trong một lỗi
def my_method_with_eval(args)
method_binding = binding
%w{ orange lemon grapefruit}.each { |variable| eval "#{variable} = args[:#{variable}]", method_binding; }
# code that uses
# orange, lemon & grapefruit in this format which is way prettier & concise than
# args[:orange] args[:lemon] args[:grapefruit]
puts "my_method_with_eval variables: #{orange}, #{lemon}, #{grapefruit}"
end
my_method_with_eval :orange => "Orange", :grapefruit => "Grapefruit"
Khi chạy mã mà tôi chỉ đơn giản là có được
NameError: undefined local variable or method ‘orange’ for main:Object method my_method_with_eval in named_args_to_local_vars at line at top level in named_args_to_local_vars at line 9
Bất cứ ai có bất kỳ ý tưởng làm thế nào tôi có thể đơn giản hóa này xuống bằng cách nào đó để tôi không phải bắt đầu các phương thức đối số được đặt tên của tôi với các tải của var = args [: var] code?
Cảm ơn, Matthew O'Riordan
Âm thanh như những gì bạn thực sự muốn ở đây là các đối số được đặt tên. Những thứ này tồn tại trong Ruby 2.0. – Ajedi32