রুবি <=> (স্পেসশিপ) অপারেটর কী?


262

রুবি <=>(স্পেসশিপ) অপারেটর কী? অপারেটর কি অন্য কোন ভাষা দ্বারা প্রয়োগ করা হয়?


1
এখন অ্যারে তুলনা সম্পর্কে কি? এটা তোলে বুক "বলেন উপাদান দ্বারা উপাদান তুলনা, ফেরৎ 0 সমান হলে, -1 যদি ক্ষুদ্রতর, 1 যদি বৃহত্তর, কিন্তু কি সম্পর্কে [1,3,2] <=> [2,2,2]?
সান ফ্রান্সিসকো।

3
@ এসএফ, লোকেরা যখন অ্যারে তুলনা করে, তখন তাদের অর্থ সাধারণত শব্দকোষ হিসাবে তুলনা করা হয় (যেমন একটি অভিধানে, যেমন [1,3,2] <[2,2,2] কারণ প্রথম উপাদানগুলি আলাদা)। কদাচিৎ (মতলব এ ফে) অ্যারের তুলনা উপাদান অনুসারে ফলাফলের একটি অ্যারে প্রদান করে; এই ক্ষেত্রে: [-1, 1, 0]।
লিওরি

নোট করুন যে অ্যারেগুলিতে শূন্য উপাদান রয়েছে সেগুলি তুলনীয় যদি কোনও শিলার আগে উপাদানগুলি পৃথক হয় এবং তুলনামূলক না হয় তবে কোনও শিল নন-নিলের সাথে তুলনা করতে হবে। অর্থাত [1, শূন্য] <=> [2, 3] => -1, তবে [1, শূন্য] <=> [1, 3] => শূন্য। এটি চুষে, মূলত।
cliffordheath 1

[1,nil] <=> [1,3]আপনি যেমন অ্যারে তুলনা nilকরার সময় অ্যালগরিদমের সামঞ্জস্যের কারণ পান, <=>ফলাফলটি না পাওয়া পর্যন্ত প্রতিটি উপাদানকে ঘুরিয়ে তুলনা করুন 0। এই উদাহরণে রুবির পক্ষে কম-বেশি বা বেশি ঘোষণা করার কোনও উপায় নেই, যেহেতু কেবল তুলনা করা যায় না। nilহিসাবে "সমান নয়" চিকিত্সা করা উচিত। আপনি যদি ডেটা সম্পর্কে কিছু জানেন এবং উদাহরণস্বরূপ আচরণ করতে চান তবে রুবি nilএটিকে 0সহজ করে তোলে।
লিলোলে

উত্তর:


359

পার্ল সম্ভবত এটি ব্যবহার করার প্রথম ভাষা ছিল। গ্রোভি এটির একটি ভাষা যা এটি সমর্থন করে। মূলত পরিবর্তে ফিরে 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

এটি অ্যারে বাছাই করার জন্য দরকারী।


27
যথাযথভাবে। আমি এটিকে জাভা তুলনার একটি খুব মার্জিত সংস্করণ হিসাবে মনে করি।
মাইক রেডেল

12
সি # তে অ্যানালগটি আইকোপমারেবল omp কম্পেরটিও
সের্গেই মিরভোদা

1
আসলে আমি মনে করি যে কোনও নেতিবাচক বা ধনাত্মক মান ফিরে আসতে পারে। 0 এখনও সমতা মানে।
সুপারলুমিনিয়ার

1
@ সুপারলুমিনারি সি এর আরআরসিএমপি ফাংশনের বিপরীতে, x <=> y ​​কেবলমাত্র -1, 0, 1, বা x এবং y তুলনীয় না হলে শূন্য (বিশেষভাবে এটি রুবি এবং অন্য কোনও ভাষাতে এটি ব্যবহার করে যা) এটির জন্য ডিজাইন করা হয়েছে। এটি অপারেটরকে ওভারলোড করা সহজ করে তোলে যেমন রুবির তুলনামূলক মিশ্রণের জন্য for পার্লে, যেখানে অপারেটরটি সম্ভবত সম্ভবত উদ্ভূত হয়েছিল, এটি প্রধানত "বাছাই করা ব্লক তালিকা" বাক্য গঠনটি সহজ করার জন্য ব্যবহৃত হয়েছিল। ব্লক হ'ল একটি সাবরোটাইন যা তালিকার আইটেমগুলি কীভাবে বাছাই করা উচিত তার উপর নির্ভর করে যে কোনও ধনাত্মক সংখ্যা, negativeণাত্মক সংখ্যা বা 0 প্রদান করতে পারে। স্পেসশিপ অপারেটর ব্লকে ব্যবহার করা সুবিধাজনক।
টনিআররা

2
নোট করুন যে দুটি বস্তুর তুলনা না করা হলে আপনি একটি শূন্যতা পান
gamov

70

স্পেসশিপ পদ্ধতিটি কার্যকর যখন আপনি নিজের শ্রেণিতে এটি সংজ্ঞায়িত করেন এবং তুলনীয় মডিউলটি অন্তর্ভুক্ত করেন । আপনার ক্লাসটি তারপরে >, < , >=, <=, ==, 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>]

20

এটি একটি সাধারণ তুলনা অপারেটর। এটির রিসিভার তার আর্গুমেন্টের চেয়ে কম, সমান বা তার চেয়ে বড় কিনা তার উপর নির্ভর করে এটি -1, 0, বা +1 প্রদান করে।


18

আমি সহজ উদাহরণ দিয়ে ব্যাখ্যা করব

  1. [1,3,2] <=> [2,2,2]

    রুবি উভয় অ্যারের প্রতিটি উপাদানকে বাম হাত থেকে তুলনা শুরু করবে। 1বাম অ্যারে জন্য ডান অ্যারের চেয়ে ছোট 2। সুতরাং বাম অ্যারে ডান অ্যারের চেয়ে ছোট। আউটপুট হবে -1

  2. [2,3,2] <=> [2,2,2]

    উপরোক্ত আলোচনা এটি প্রথম বাম অ্যারের এই ক্ষেত্রে দ্বিতীয় উপাদানের ক্ষেত্রে, প্রথম উপাদান যা হয় সমান তারপর এটি দ্বিতীয় উপাদান তুলনা করবে তুলনা করবে বৃহত্তর অত: পর আউটপুট হয় 1


এটি কেবল প্রতিটি অ্যারের প্রথম বাম উপাদানটির তুলনা করে বা অন্যান্য উপাদানগুলির সাথে তুলনা চালিয়ে যায়? ভাল ব্যাখ্যা
কিক বাটোসস্কি

1
@ কিকবাট্টোস্কি এটি বৈষম্য সংখ্যা না পাওয়া পর্যন্ত অন্যান্য উপাদানগুলির সাথে তুলনা করতে অবিরত রাখে।
অনিল মৌর্য

5

যেহেতু এই অপারেটরটি একটি পূর্ণসংখ্যার ভাবের সাথে তুলনা কমায়, তাই এটি একাধিক কলাম / বৈশিষ্ট্যের উপর ভিত্তি করে আরোহণ বা উতরাইয়ের সর্বাধিক সাধারণ উদ্দেশ্যে উপায় সরবরাহ করে।

উদাহরণস্বরূপ, যদি আমার কাছে অবজেক্টগুলির একটি অ্যারে থাকে তবে আমি এই জাতীয় জিনিসগুলি করতে পারি:

# `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
# [Notice powers of 2 make it work for > 2 columns.]
my_objects.sort! do |a, b|
      8 * (a.zip   <=> b.zip) +
     -4 * (a.age   <=> b.age) +
      2 * (a.last  <=> b.last) +
          (a.first <=> b.first)
end

এই বেসিক প্যাটার্নটি প্রতিটি উপরে আরোহণ / অবতরণের যে কোনও ক্রম অনুসারে যে কোনও কলামের সংখ্যা অনুসারে বাছাই করতে সাধারণ করা যেতে পারে।


দুর্দান্ত উদাহরণ, শেষেরটি প্রত্যাশার মতো কাজ করে না। ক্রমগুলি উতর ক্রমে দুটি হিসাবে শক্তির হওয়া উচিত, অর্থাৎ 8, -4, 2, 1। আপনি যেভাবে এটি লিখেছেন (4, -3,2,1 গুণক সহ) যেমন "বয়স + পদবি" জিপের চেয়ে বেশি গণনা করা হয় "...
এলমার জান্ডার

আমি মনে করি না যে এই সংখ্যাগুলি আপনি কী ভাবেন তার অর্থ কী। প্রতিটি ফ্যাক্টর সাইনামকে বহুগুণ করে, যা -1, 0 বা 1 হবে 2 2 পাওয়ার এখানে এখানে কিছু যায় আসে না। -3 * (a.age <=> b.age) 3 * (b.age <=> a.age) এর মতোই। ফলাফলের লক্ষণ এটি এএসসি বা ডেস্ক তৈরি করে।
লিলোলে

না, এটা অনেক কিছু যায় আসে। জিপের জন্য ফ্যাক্টরটি অবশ্যই অন্যান্য সমস্ত কারণগুলির (নিরঙ্কুশ) যোগফলের চেয়ে বড় হতে হবে এবং বয়সের জন্য ফ্যাক্টরটি অবশ্যই শেষ এবং প্রথমগুলির কারণগুলির (নিরঙ্কুশ) যোগফলের চেয়ে বড় হতে হবে এবং এই জাতীয়। এবং সংখ্যার ক্ষুদ্রতম ক্রমটি যা দুটি শক্তির ক্রম পূর্ণ করে ... এবং বিটিডাব্লু আপনি যদি আমার মন্তব্যটি মনোযোগ সহকারে পড়েন তবে আপনি দেখতে পাবেন যে আমি বিয়োগ চিহ্নটি অন্তর্ভুক্ত করেছি ...
এলমার জান্ডার

1
ঠিক আছে, সম্ভবত আমি এ সম্পর্কে আরও কিছু বিশদভাবে বর্ণনা করব: কারণগুলির সাথে (4, -3,2,1) এবং স্পেসশিপ অপের ফলাফল (1,1, -1, -1) ওজনফল যোগফল -2 হয় তবে এটি ইতিবাচক হওয়া প্রয়োজন! অন্যথায় বৃহত্তর জিপটি ছোট জিপের আগে আসবে। এটি কারণগুলির সাথে ঘটবে না (8, -4,2,1)।
এলমার জান্ডার

1
আহ আমি এখন দেখছি, যদি> 2 কলামগুলিকে বাছাই করা হয় তবে 2 এর শক্তি প্রয়োজন। এটি সংশোধন করতে সাহায্য করার জন্য ধন্যবাদ। দুঃখিত 3 যদি আপনার 3 বা ততোধিক কলামের বাছাই করা ভুল হয়ে যায়।
লিলোলে

-2

কী <=> ('স্পেসশিপ' অপারেটর)

অপারেটরের সাথে পরিচয় করিয়ে দেওয়া আরএফসি অনুসারে , $ a <=>$ b

 -  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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.