রেজেেক্স এবং ব্যাক রেফারেন্স সহ রুবি সুইচ স্টেটমেন্ট (কেস… কবে) লিখবেন?


89

আমি জানি যে আমি নিয়মিত প্রকাশের সাথে ম্যাচ চেক করতে রুবি কেস স্টেটমেন্ট লিখতে পারি। তবে আমি আমার রিটার্নের বিবৃতিতে ম্যাচের ডেটা ব্যবহার করতে চাই। এই অর্ধ-সিউডোকোডের মতো কিছু:

foo = "10/10/2011"

case foo
    when /^([0-9][0-9])/
        print "the month is #{match[1]}"
    else
        print "something else"
end

আমি কীভাবে এটি অর্জন করতে পারি?

ধন্যবাদ!


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


4
রুবির ডেট.পার্স অনেক তারিখের ফর্ম্যাটগুলি বোঝে। আপনি কি এটা চেষ্টা করেছেন?
বালিকা

যদিও এটি এই প্রশ্নের উত্তর দেয় না, আপনি সম্ভবত ক্রনিক রত্নটি দেখতে চান ...
ডিজিএম

উত্তর:


156

সর্বশেষতম রেজেক্স ম্যাচিং গ্রুপগুলির উল্লেখগুলি সর্বদা সিউডো ভেরিয়েবলগুলিতে এতে সংরক্ষণ করা $1হয় $9:

case foo
when /^([0-9][0-9])/
    print "the month is #{$1}"
else
    print "something else"
end

$LAST_MATCH_INFOপুরো MatchDataঅবজেক্টে পেতে সিউডো ভেরিয়েবলটিও ব্যবহার করতে পারেন । নামকৃত ক্যাপচারগুলি ব্যবহার করার সময় এটি কার্যকর হতে পারে:

case foo
when /^(?<number>[0-9][0-9])/
    print "the month is #{$LAST_MATCH_INFO['number']}"
else
    print "something else"
end

4
@ ইয়াসি আপনার কাছে থ্রেড সুরক্ষা সম্পর্কে আপনার মন্তব্যের জন্য কোনও উত্স আছে? আমি সবেমাত্র রুবি ১.৮..7 এ একটি পরীক্ষা করেছি যা দেখে মনে হয় যে এটি থ্রেড-নিরাপদ! (প্রতি এক সেকেন্ডে একটি রেজেক্সের সাথে ম্যাচ করা থ্রেড - স্থানীয় ম্যাচগুলি ক্লাবড হচ্ছে কিনা তবে আইআরবিতে পরীক্ষা করা)
জোয়েল

4
নিয়মিত প্রকাশের সাথে -1 $ পরিবর্তনগুলি বৈশ্বিক নয় যদিও এর সামনে ডলারের সাইন রয়েছে।
অ্যান্ড্রু গ্রিম

@ অ্যান্ড্রুগ্রিম এটি দেখানোর জন্য ধন্যবাদ। আমি এটা সম্পর্কে অবগত ছিল না। আমাকে প্রচুর পুরানো কোডটি পরিবর্তন করতে হবে: - /
ইয়াসি

আপনিও করতে পারেন $1, $2... $9বা Regexp.last_match(1)রুবোকপ দ্বারা প্রস্তাবিত হিসাবে
এডগার অরতেগা

6

এখানে একটি বিকল্প পদ্ধতি যা আপনাকে একই ফলাফল দেয় তবে একটি স্যুইচ ব্যবহার করে না। আপনি যদি আপনার নিয়মিত প্রকাশগুলি অ্যারেতে রাখেন তবে আপনি এরকম কিছু করতে পারেন:

res = [ /pat1/, /pat2/, ... ]
m   = nil
res.find { |re| m = foo.match(re) }
# Do what you will with `m` now.

mব্লকের বাইরে ঘোষণা করার পরে findএটি ব্লকটি সম্পন্ন হওয়ার পরেও উপলব্ধ হওয়ার অনুমতি দেয় এবং findব্লকের সত্যিকারের মূল্য ফেরার সাথে সাথেই বন্ধ হয়ে যায় যাতে আপনি একই শর্টকাটটিং আচরণ পান যা একটি সুইচ আপনাকে দেয়। এটি আপনাকে সম্পূর্ণরূপে দেয় MatchDataযদি আপনার প্রয়োজন হয় (সম্ভবত আপনি আপনার রেজিজেসগুলিতে নামকৃত ক্যাপচার গ্রুপগুলি ব্যবহার করতে চান) এবং আপনার রেজিক্সগুলিকে আপনার অনুসন্ধান যুক্তি (যা পরিষ্কার কোডটি প্রদান করতে পারে বা নাও পারে) থেকে সুন্দরভাবে পৃথক করে, আপনি এমনকি আপনার রেজিক্সগুলি একটি থেকে লোড করতে পারেন ফাইলটি কনফিগার করুন বা সেগুলির মধ্যে কোন সেটটি আপনি রান সময় চেয়েছিলেন তা চয়ন করুন।


আমি caseপদ্ধতির সাহায্যে থ্রেড সুরক্ষা সম্পর্কেও ভাবছিলাম । কেস অ্যাপ্রোচ (?) সহ গ্লোবাল ভেরিয়েবলের পরিবর্তে আপনি থ্রেডেড দৃশ্যে মু এর পদ্ধতির ব্যবহার করতে চান
ক্যাস্পার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.