Helpex - Trao đổi & giúp đỡ Đăng nhập
74

Ai đó có thể vui lòng cho tôi biết những gì

send("#{Model.find...}")

là và không?

74 hữu ích 1 bình luận 67k xem chia sẻ
85

send gửi một thông điệp đến một thể hiện đối tượng và tổ tiên của nó trong hệ thống phân cấp lớp cho đến khi một phương thức nào đó phản ứng (vì tên của nó khớp với đối số đầu tiên).

Thực tế mà nói, những dòng đó là tương đương:

1.send '+', 2
1.+(2)
1 + 2

Lưu ý rằng sendbỏ qua kiểm tra khả năng hiển thị, do đó bạn cũng có thể gọi các phương thức riêng tư (hữu ích cho kiểm tra đơn vị).


Nếu thực sự không có biến trước khi gửi, điều đó có nghĩa là Đối tượng toàn cầu được sử dụng:

send :to_s    # "main"
send :class   # Object
85 hữu ích 3 bình luận chia sẻ
85

gửi là một phương thức ruby ​​(không có đường ray) cho phép gọi một phương thức khác theo tên.

Từ tài liệu

   class Klass
     def hello(*args)
       "Hello " + args.join(' ')
     end
   end
   k = Klass.new
   k.send :hello, "gentle", "readers"   #=> "Hello gentle readers"

http://corelib.rubyonrails.org/groupes/Object.html#M001077

85 hữu ích 1 bình luận chia sẻ
48

Một trong những tính năng hữu ích nhất mà tôi nghĩ với phương thức .send là nó có thể tự động gọi phương thức. Điều này có thể giúp bạn tiết kiệm rất nhiều gõ. Một trong những cách sử dụng phổ biến nhất của phương thức .send là gán các thuộc tính động. Ví dụ:

class Car
  attr_accessor :make, :model, :year
end  

Để gán thuộc tính thường xuyên, người ta sẽ cần

c = Car.new
c.make="Honda"
c.model="CRV"
c.year="2014"

Hoặc sử dụng phương thức .send:

c.send("make=", "Honda")
c.send("model=", "CRV")
c.send("year=","2014")

Nhưng tất cả có thể được thay thế bằng những điều sau đây:

Giả sử ứng dụng Rails của bạn cần gán các thuộc tính cho lớp ô tô của bạn từ đầu vào của người dùng, bạn có thể làm

c = Car.new()
params.each do |key, value|
  c.send("#{key}=", value)
end
48 hữu ích 5 bình luận chia sẻ
8

Một ví dụ khác, tương tự như https://stackoverflow.com/a/26193804/1897857 của Antonio Jha

là nếu bạn cần đọc các thuộc tính trên một đối tượng.

Ví dụ: nếu bạn có một chuỗi các chuỗi, nếu bạn cố gắng lặp qua chúng và gọi chúng trên đối tượng của bạn, nó sẽ không hoạt động.

atts = ['name', 'description']
@project = Project.first
atts.each do |a|
  puts @project.a
end
# => NoMethodError: undefined method `a'

Tuy nhiên, bạn có thể sendcác chuỗi cho đối tượng:

atts = ['name', 'description']
@project = Project.first
atts.each do |a|
  puts @project.send(a)
end
# => Vandalay Project
# => A very important project
8 hữu ích 4 bình luận chia sẻ
0

Một trường hợp sử dụng khác cho lượt xem:

    <%= link_to 
    send("first_part_of_path_{some_dynamic_parameters}_end_path", 
    attr1, attr2), ....
    %>

Cho phép. bạn để viết chế độ xem có thể mở rộng, người làm việc với tất cả các loại đối tượng với:

    render 'your_view_path', object: "my_object"
0 hữu ích 0 bình luận chia sẻ
0

sendlà một cách khác để gọi một phương thức. Điều này được minh họa tốt nhất bằng ví dụ:

o = Object.new
o.send(:to_s) # => "#<Object:0x00005614d7a24fa3>"
# is equivalent to:
o.to_s # => "#<Object:0x00005614d7a24fa3>"

Lợi ích của phương pháp này là bạn có thể truyền vào phương thức bạn muốn gọi làm tham số. Đây là một ví dụ đơn giản:

def dynamically_call_a_method(name)
    o = Object.new
    o.send name 
end
dynamically_call_a_method(:to_s) # => "#<Object:0x00005614d7a24fa3>"

Bạn có thể vượt qua trong phương thức bạn muốn được gọi. Trong trường hợp này, chúng tôi đã thông qua :to_s.

0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ ruby , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading