ما هو مشغل روبي <=> (سفينة الفضاء)؟
-
06-07-2019 - |
سؤال
ما هو الروبى <=>
مشغل (سفينة الفضاء)؟هل يتم تنفيذ المشغل بأي لغات أخرى؟
المحلول
وكان بيرل المرجح اللغة الأولى لاستخدامه. رائع هو لغة أخرى تدعم ذلك. في الأساس بدلا من العودة 1
(true
) أو 0
(false
) اعتمادا على ما إذا كانت الحجج متساوية أو غير متساوية، فإن المشغل سفينة الفضاء العودة 1
، 0
، أو −1
اعتمادا على قيمة الوسيطة اليسرى بالنسبة للحجة الصحيحة.
a <=> b :=
if a < b then return -1
if a = b then return 0
if a > b then return 1
if a and b are not comparable then return nil
وانها مفيدة لفرز صفيف.
نصائح أخرى
وهذه الطريقة سفينة الفضاء مفيد عند تحديده في الفئة الخاصة بك وتشمل قابلة للمقارنة وحدة . صفك ثم يحصل على أساليب >, < , >=, <=, ==, and between?
مجانا.
class Card
include Comparable
attr_reader :value
def initialize(value)
@value = value
end
def <=> (other) #1 if self>other; 0 if self==other; -1 if self<other
self.value <=> other.value
end
end
a = Card.new(7)
b = Card.new(10)
c = Card.new(8)
puts a > b # false
puts c.between?(a,b) # true
# Array#sort uses <=> :
p [a,b,c].sort # [#<Card:0x0000000242d298 @value=7>, #<Card:0x0000000242d248 @value=8>, #<Card:0x0000000242d270 @value=10>]
وانها عامل مقارنة العام. تقوم بإرجاع إما -1، 0، أو +1 اعتمادا على ما إذا المتلقي لها أقل من يساوي أو أكبر من حجتها.
سأشرح بمثال بسيط
[1,3,2] <=> [2,2,2]
سيبدأ روبي في مقارنة كل عنصر من كلا المصفوفتين من الجانب الأيسر.
1
للصفيف الأيسر أصغر من2
من المصفوفة الصحيحة.وبالتالي فإن المصفوفة اليسرى أصغر من المصفوفة اليمنى.سيكون الإخراج-1
.[2,3,2] <=> [2,2,2]
كما هو مذكور أعلاه، سيتم أولاً مقارنة العنصر الأول المتساوي ثم سيتم مقارنة العنصر الثاني، في هذه الحالة يكون العنصر الثاني من المصفوفة اليسرى أكبر ومن ثم يكون الناتج
1
.
ومنذ هذا المشغل يقلل المقارنات إلى تعبير صحيح، فإنه يوفر وسيلة الغرض الأكثر عمومية لفرز تصاعدي أو تنازلي بناء على عدة أعمدة / الصفات.
وعلى سبيل المثال، إذا كان لدي مجموعة من الأشياء أنا يمكن أن تفعل أشياء من هذا القبيل:
# `sort!` modifies array in place, avoids duplicating if it's large...
# Sort by zip code, ascending
my_objects.sort! { |a, b| a.zip <=> b.zip }
# Sort by zip code, descending
my_objects.sort! { |a, b| b.zip <=> a.zip }
# ...same as...
my_objects.sort! { |a, b| -1 * (a.zip <=> b.zip) }
# Sort by last name, then first
my_objects.sort! { |a, b| 2 * (a.last <=> b.last) + (a.first <=> b.first) }
# Sort by zip, then age descending, then last name, then first
my_objects.sort! do |a, b|
4 * (a.zip <=> b.zip) +
-3 * (a.age <=> b.age) +
2 * (a.last <=> b.last) +
(a.first <=> b.first)
end
ويمكن تعميمها هذا النمط الأساسي لفرز من قبل أي عدد من الأعمدة، في أي التقليب من تصاعدي / تنازلي في كل منها.
ما هو
<=>
(مشغّل "سفينة الفضاء")
بحسب ال RFC الذي قدم المشغل, ، $أ <=>
$ب
- 0 if $a == $b
- -1 if $a < $b
- 1 if $a > $b
- Return 0 if values on either side are equal
- Return 1 if value on the left is greater
- Return -1 if the value on the right is greater
مثال:
//Comparing Integers
echo 1 <=> 1; //ouputs 0
echo 3 <=> 4; //outputs -1
echo 4 <=> 3; //outputs 1
//String Comparison
echo "x" <=> "x"; // 0
echo "x" <=> "y"; //-1
echo "y" <=> "x"; //1
أكثر:
// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1
// Arrays
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1
// Objects
$a = (object) ["a" => "b"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 0