Tôi đã có logic sau trong mã của mình:
if !@players.include?(p.name)
...
end
@players
là một mảng. Có một phương pháp để tôi có thể tránh !
?
Lý tưởng nhất, đoạn trích này sẽ là:
if @players.does_not_include?(p.name)
...
end
Tôi đã có logic sau trong mã của mình:
if !@players.include?(p.name)
...
end
@players
là một mảng. Có một phương pháp để tôi có thể tránh !
?
Lý tưởng nhất, đoạn trích này sẽ là:
if @players.does_not_include?(p.name)
...
end
Câu trả lời:
if @players.exclude?(p.name)
...
end
ActiveSupport thêm exclude?
phương pháp để Array
, Hash
và String
. Đây không phải là Ruby nguyên chất, nhưng được sử dụng bởi rất nhiều người chơi ruby.
require 'active_support/core_ext/enumerable'
Ở đây bạn đi:
unless @players.include?(p.name)
...
end
Bạn có thể xem Hướng dẫn về Phong cách Ruby để biết thêm thông tin về các kỹ thuật tương tự.
if flag unless @players.include?(p.name)
là vụng về và if flag && !@players.include?(p.name)
sử dụng phủ định.
if
chỉ để true
vượt qua điều kiện, hãy unless
vượt qua false
và nil
. Điều này đôi khi dẫn đến khó tìm lỗi. Do đó tôi thíchexclude?
Làm thế nào về những điều sau đây:
unless @players.include?(p.name)
....
end
Chỉ nhìn vào Ruby:
TL; DR
Sử dụng none?
vượt qua nó một khối ==
để so sánh:
[1, 2].include?(1)
#=> true
[1, 2].none? { |n| 1 == n }
#=> false
Array#include?
chấp nhận một đối số và sử dụng ==
để kiểm tra đối với từng phần tử trong mảng:
player = [1, 2, 3]
player.include?(1)
#=> true
Enumerable#none?
cũng có thể chấp nhận một đối số trong trường hợp nó sử dụng ===
để so sánh. Để có được hành vi đối nghịch với include?
chúng ta bỏ qua tham số và truyền cho nó một khối sử dụng ==
để so sánh.
player.none? { |n| 7 == n }
#=> true
!player.include?(7) #notice the '!'
#=> true
Trong ví dụ trên chúng ta thực sự có thể sử dụng:
player.none?(7)
#=> true
Đó là bởi vì Integer#==
và Integer#===
là tương đương. Nhưng hãy xem xét:
player.include?(Integer)
#=> false
player.none?(Integer)
#=> false
none?
trả về false
vì Integer === 1 #=> true
. Nhưng thực sự là một notinclude?
phương pháp hợp pháp nên trở lại true
. Vì vậy, như chúng tôi đã làm trước đây:
player.none? { |e| Integer == e }
#=> true
module Enumerable
def does_not_include?(item)
!include?(item)
end
end
Ok, nhưng nghiêm túc, trừ khi hoạt động tốt.
unless
không sao cho đoạn trích được hiển thị, nhưng điều kiện có thể phức tạp hơn. Tôi nghĩ thật tiện lợi khi có các phương thức phủ định này, chúng cho phép nhiều mã khai báo hơn.
Sử dụng unless
:
unless @players.include?(p.name) do
...
end
Sử dụng unless
là tốt cho các câu lệnh với include?
các mệnh đề đơn , nhưng, ví dụ, khi bạn cần kiểm tra sự bao gồm của một cái gì đó Array
nhưng không phải trong một cái khác, thì việc sử dụng include?
với exclude?
sẽ thân thiện hơn nhiều.
if @players.include? && @spectators.exclude? do
....
end
Nhưng như dizzy42 đã nói ở trên, việc sử dụng exclude?
yêu cầu ActiveSupport
Hãy thử điều này, đó là Ruby thuần túy nên không cần thêm bất kỳ khung ngoại vi nào
if @players.include?(p.name) == false do
...
end
Tôi đã vật lộn với một logic tương tự trong vài ngày, và sau khi kiểm tra một số diễn đàn và bảng hỏi đáp, nhưng hóa ra giải pháp thực sự khá đơn giản.
Tôi đã tìm kiếm điều này cho bản thân mình, tìm thấy điều này, và sau đó là một giải pháp. Mọi người đang sử dụng các phương pháp khó hiểu và một số phương pháp không hoạt động trong một số tình huống nhất định hoặc hoàn toàn không.
Tôi biết bây giờ đã quá muộn, vì điều này đã được đăng 6 năm trước, nhưng hy vọng khách truy cập trong tương lai tìm thấy điều này (và hy vọng, nó có thể dọn sạch mã của họ và của bạn.)
Giải pháp đơn giản:
if not @players.include?(p.name) do
....
end
do
ruby hợp lệ? tôi gặp lỗisyntax error, unexpected end-of-input
(hoạt động nếu tôi xóado
)