Ruby có hỗ trợ nhẹ về cú pháp cho quy trình ẩn danh bằng chữ (được gọi là khối trong Ruby). Do đó, nó không cần một tính năng ngôn ngữ mới cho việc này.
(Nói chung, đó là dấu hiệu xấu, nếu bạn cần thêm các tính năng ngôn ngữ. Bạn có thể triển khai mọi thứ trong thư viện, nếu không đó là dấu hiệu của thiết kế ngôn ngữ xấu.Vì vậy, những gì bạn thường làm là viết một phương thức nhận một khối mã, phân bổ tài nguyên, thực thi khối mã trong ngữ cảnh của tài nguyên đó và sau đó đóng tài nguyên.
Something như thế này:
def with(klass, *args)
yield r = klass.open(*args)
ensure
r.close
end
Bạn có thể sử dụng nó như thế này:
with File, 'temp.txt', 'w' do |f|
f.write 'hi'
raise 'spitespite'
end
Tuy nhiên, đây là một cách rất thủ tục để làm điều này. Ruby là một ngôn ngữ hướng đối tượng, có nghĩa là trách nhiệm của thực hiện đúng một khối mã trong bối cảnh của một File
phải thuộc về lớp File
:
File.open 'temp.txt', 'w' do |f|
f.write 'hi'
raise 'spitespite'
end
Điều này có thể được thực hiện một cái gì đó như thế này:
def File.open(*args)
f = new(*args)
return f unless block_given?
yield f
ensure
f.close if block_given?
end
Đây là mẫu chung được thực hiện bởi nhiều lớp trong thư viện lõi Ruby, thư viện chuẩn và thư viện của bên thứ ba.
Một tương ứng chặt chẽ hơn đối với các giao thức chung Python quản lý bối cảnh sẽ là:
def with(ctx)
yield ctx.setup
ensure
ctx.teardown
end
class File
def setup; self end
alias_method :teardown, :close
end
with File.open('temp.txt', 'w') do |f|
f.write 'hi'
raise 'spitespite'
end
Lưu ý rằng đây là hầu như không thể phân biệt từ ví dụ Python, nhưng nó không đòi hỏi việc bổ sung các cú pháp mới với ngôn ngữ.
yea tôi đồng ý đó là một dấu hiệu xấu khi ngôn ngữ của bạn cần các tính năng mới. lý do duy nhất bạn cần 'bằng' trong Python là bởi vì các chức năng ẩn danh bị suy giảm không có lý do. Bởi lược đồ logic đó là tốt nhất vì bạn có thể thực hiện các tính năng mới của mình bằng macro =) – Claudiu
câu trả lời tuyệt vời –
+1 Nó rất tuyệt có thể thêm điều này vào ngôn ngữ khi đang di chuyển (và với một lượng nhỏ mã như vậy) .Tôi nghĩ rằng cũng có một lợi thế của việc có một cú pháp phong phú trong ngôn ngữ đó.Tất cả các nhà phát triển Python đều biết những gì "với" có nghĩa là trong Python , và nó được ghi lại trên trang web/sách Python –