سؤال

ما هو الروبى <=> مشغل (سفينة الفضاء)؟هل يتم تنفيذ المشغل بأي لغات أخرى؟

هل كانت مفيدة؟

المحلول

وكان بيرل المرجح اللغة الأولى لاستخدامه. رائع هو لغة أخرى تدعم ذلك. في الأساس بدلا من العودة 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. [1,3,2] <=> [2,2,2]

    سيبدأ روبي في مقارنة كل عنصر من كلا المصفوفتين من الجانب الأيسر.1 للصفيف الأيسر أصغر من 2 من المصفوفة الصحيحة.وبالتالي فإن المصفوفة اليسرى أصغر من المصفوفة اليمنى.سيكون الإخراج -1.

  2. [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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top