ruby gửi phương thức truyền nhiều tham số


129

Cố gắng tạo các đối tượng và gọi các phương thức một cách linh hoạt bằng cách

Object.const_get(class_name).new.send(method_name,parameters_array)

hoạt động tốt khi

Object.const_get(RandomClass).new.send(i_take_arguments,[10.0])

nhưng ném sai số lượng đối số 1 cho 2 cho

Object.const_get(RandomClass).new.send(i_take_multiple_arguments,[25.0,26.0])

Lớp ngẫu nhiên được định nghĩa là

class RandomClass
def i_am_method_one
    puts "I am method 1"
end
def i_take_arguments(a)
    puts "the argument passed is #{a}"
end
def i_take_multiple_arguments(b,c)
    puts "the arguments passed are #{b} and #{c}"
end
    end

Ai đó có thể giúp tôi về cách gửi các tham số mutipl đến một phương thức ruby ​​một cách linh hoạt

Câu trả lời:


232
send("i_take_multiple_arguments", *[25.0,26.0]) #Where star is the "splat" operator

hoặc là

send(:i_take_multiple_arguments, 25.0, 26.0)

22
Có thể đáng chú ý rằng *trong bối cảnh này là toán tử "splat".
Andrew Marshall

8

Bạn có thể gọi xen kẽ sendvới từ đồng nghĩa __send__:

r = RandomClass.new
r.__send__(:i_take_multiple_arguments, 'a_param', 'b_param')

Nhân tiện * bạn có thể vượt qua băm khi các dấu phẩy được phân tách như vậy:

imaginary_object.__send__(:find, :city => "city100")

hoặc cú pháp băm mới:

imaginary_object.__send__(:find, city: "city100", loc: [-76, 39])

Theo Black, __send__an toàn hơn với không gian tên.

Sending Gửi là một khái niệm rộng: email được gửi, dữ liệu được gửi đến ổ cắm I / O, v.v. Không có gì lạ khi các chương trình định nghĩa một phương thức gọi là gửi xung đột với phương thức gửi tích hợp của Ruby. Do đó, Ruby cung cấp cho bạn một cách khác để gọi gửi : __send__. Theo quy ước, không ai từng viết một phương thức với tên đó, vì vậy phiên bản Ruby tích hợp luôn có sẵn và không bao giờ xung đột với các phương thức mới được viết. Trông có vẻ lạ, nhưng nó an toàn hơn phiên bản gửi đơn giản theo quan điểm của các phương thức đụng độ tên phương thức

Đen cũng cho thấy gói các cuộc gọi đến __send__trong if respond_to?(method_name).

if r.respond_to?(method_name)
    puts r.__send__(method_name)
else
    puts "#{r.to_s} doesn't respond to #{method_name}"
end

Tham khảo: Đen, David A. Rubyist có căn cứ. Quản lý, 2009. P.171.

* Tôi đến đây để tìm kiếm cú pháp băm cho __send__, vì vậy có thể hữu ích cho các nhân viên khác. ;)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.