রুবি কোয়ানস: কেন প্রতীকগুলির তালিকাটিকে স্ট্রিংয়ে রূপান্তর করুন


86

আমি এই পরীক্ষাটি রুবি কোয়ানস https://github.com/edgecase/ruby_koans/blob/master/src/about_symbols.rb#L26 এ সম্পর্কে_সাইবিউলস.আরবিতে উল্লেখ করছি

def test_method_names_become_symbols
  symbols_as_strings = Symbol.all_symbols.map { |x| x.to_s }
  assert_equal true, symbols_as_strings.include?("test_method_names_become_symbols")
end


  # THINK ABOUT IT:
  #
  # Why do we convert the list of symbols to strings and then compare
  # against the string value rather than against symbols?

কেন প্রথমে আমাদের সেই তালিকাটিকে প্রথমে স্ট্রিংয়ে রূপান্তর করতে হবে?

উত্তর:


112

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

আপনি যদি সাধারণ পরীক্ষাটি করেন : পরীক্ষা == "পরীক্ষা" , এটি মিথ্যা হবে। সুতরাং, আপনি যদি এতদূর নির্ধারিত সমস্ত চিহ্নগুলিকে একটি অ্যারে রূপান্তর করতে চান তবে তাদের তুলনা করার আগে আপনাকে প্রথমে সেগুলিতে স্ট্রিংয়ে রূপান্তর করতে হবে। আপনি এটি বিপরীত উপায়ে করতে পারবেন না (প্রথমে আপনাকে একটি চিহ্নের সাথে তুলনা করতে চান সেই স্ট্রিংটি রূপান্তর করুন) কারণ এটি করার ফলে সেই চিহ্নের একক উদাহরণ তৈরি হবে এবং আপনি যে চিহ্নটিকে অস্তিত্বের জন্য পরীক্ষা করছেন তার সাথে আপনার তালিকাটিকে "দূষিত" করবে।

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


4
নোট করুন যে নিরাপদে এটি করার আরও ভাল উপায় হ'ল Symbol.all_symbolsএকটি ভেরিয়েবলের আউটপুট বরাদ্দ করা , তারপরে অন্তর্ভুক্তির জন্য পরীক্ষা করা। প্রতীকগুলি তুলনায় দ্রুততর এবং আপনি হাজার হাজার চিহ্নকে স্ট্রিংয়ে রূপান্তর করা এড়িয়ে যাচ্ছেন।
কোরওওয়ার্ড

4
এটি এখনও প্রতীক তৈরি করতে সমস্যা রয়েছে যা ধ্বংস করা যায় না। প্রতীকটির জন্য ভবিষ্যতের যে কোনও পরীক্ষা নষ্ট হবে। তবে এটি কেবল একটি কোয়ান, এটির পক্ষে বেশি বোঝা বা দ্রুত হওয়া দরকার না, কেবল চিহ্নগুলি কীভাবে কাজ করে তা প্রদর্শন করুন।
AboutRuby

4
এই উত্তরটি আমার পক্ষে কাজ করে না। যদি আমরা কোনও প্রতীকের অস্তিত্ব অনুসন্ধান করি তবে আমরা কেন একটি স্ট্রিং আর্গুমেন্ট include?নির্দিষ্ট :test_method_names_become_symbolsকরছি যদি আমরা নির্দিষ্ট করে থাকি তবে আমাদের সমস্ত চিহ্নগুলিকে স্ট্রিংয়ে রূপান্তর করতে হবে না।
আইজাক রবিনোভিচ

4
আইজাক, কারণ চিহ্নিত সমস্যাটি, যা :test_method_names_become_symbolsতুলনা নির্দিষ্টকরণ এটি তৈরি করবে, তাই তুলনা সর্বদা সত্য হবে। all_symbolsস্ট্রিংগুলিতে রূপান্তর করে এবং স্ট্রিংগুলির সাথে তুলনা করে, আমরা তুলনা করার আগে প্রতীকটি উপস্থিত ছিল কিনা তা পার্থক্য করতে পারি।
স্টিফেন

4
এত কিছুই বুঝি না। যদি আমি >> অ্যারে_ফ_সিম্বলস = সিম্বল.সাল_সিমাবলস করি, তবে >> অ্যারে_ফ_সাইমবোলস.সামগ্রী? (: না_ইয়েট_ইউজড) হয়েছে, আমি মিথ্যা হয়েছি এবং সংজ্ঞায়িত এমন কোনও কিছুর জন্য সত্য হয়েছি, সুতরাং স্ট্রিংগুলিতে রূপান্তর কেন প্রয়োজনীয় তা আমি বুঝতে পারি না ।
কোডেনুব

75

কারণ যদি আপনি:

assert_equal true, all_symbols.include?(:test_method_names_become_symbols)

এটি (আপনার রুবি বাস্তবায়নের উপর নির্ভর করে) স্বয়ংক্রিয়ভাবে সত্য হতে পারে, কারণ :test_method_names_become_symbolsপ্রতীক তৈরি করে। দেখুন এই বাগ রিপোর্ট


4
সুতরাং গৃহীত উত্তরটি ভুল (বা এটি আমার কাছে মনে হয়)।
আইজাক রবিনোভিচ

4
আইজাক, অন্য উত্তরটি ভুল নয় তবে এটি সংক্ষিপ্তভাবে ব্যাখ্যা করা হয়নি। অবশ্যই। যাইহোক, আপনি নিম্নলিখিতটির সাথে অ্যান্ড্রু যা বলছেন তা যাচাই করতে পারবেন: assert_equal true, Symbol.all_symbols.incolve? (: Abcdef) প্রতীক নির্বিশেষে এটি সর্বদা পাস হবে (কমপক্ষে, এটি আমার জন্য করে) আমি অনুমান করি একটি পাঠ হ'ল, বুলিয়ান পতাকা হিসাবে চিহ্নগুলির উপস্থিতি / অনুপস্থিতি ব্যবহার করার চেষ্টা করবেন না।
স্টিফেন

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

4

উপরের দুটি উত্তরই সঠিক, তবে উপরের কার্তিকের প্রশ্নের আলোকে আমি ভেবেছিলাম আমি একটি পরীক্ষা পোস্ট করব যা দেখায় যে কেউ কীভাবে সঠিকভাবে কোনও includeপদ্ধতির প্রতীকটি পাস করতে পারে

def test_you_create_a_new_symbol_in_the_test
  array_of_symbols = []
  array_of_symbols << Symbol.all_symbols
  all_symbols = Symbol.all_symbols.map {|x| x}
  assert_equal false, array_of_symbols.include?(:this_should_not_be_in_the_symbols_collection)  #this works because we stored all symbols in an array before creating the symbol :this_should_not_be_in_the_symbols_collection in the test
  assert_equal true, all_symbols.include?(:this_also_should_not_be_in_the_symbols_collection) #This is the case noted in previous answers...here we've created a new symbol (:this_also_should_not_be_in_the_symbols_collection) in the test and then mapped all the symbols for comparison. Since we created the symbol before querying all_symbols, this test passes.
end

কোয়ানদের সম্পর্কে একটি অতিরিক্ত নোট: putsআপনি কিছু বুঝতে না পারলে বিবৃতি পাশাপাশি কাস্টম পরীক্ষাগুলি ব্যবহার করুন । উদাহরণস্বরূপ, যদি আপনি দেখতে পান:

string = "the:rain:in:spain"
words = string.split(/:/)

এবং কী wordsহতে পারে তার কোনও ধারণা নেই , লাইনটি যুক্ত করুন

puts words

এবং rakeকমান্ড লাইনে চালান । তেমনিভাবে, আমি উপরে যেভাবে যুক্ত করেছি তার মতো পরীক্ষাগুলি রুবির কিছু ঘনত্ব বোঝার ক্ষেত্রে সহায়ক হতে পারে।


এই প্রশ্নটির দিকে তাকানো, যা এখনও আমার আগ্রহী, 2 বছর পরে, আমি সত্যিই এই উত্তর এবং মন্তব্যগুলির প্রশংসা করি।
কোডেনুব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.