কেন পার্ল 6 সিকোয়েন্সগুলিতে কোনও "প্রতিটি" পদ্ধতি নেই?


14

কখনও কখনও আমি পার্ল 6 আরপিএলে পদ্ধতি কলগুলির একটি চেইন লেখা শুরু করব, যেমন:

".".IO.dir.grep(...).map(...).

... এবং তখন আমি বুঝতে পারি যে চূড়ান্ত তালিকার সাথে আমি যা করতে চাই তা হ'ল প্রতিটি উপাদানকে তার নিজস্ব লাইনে মুদ্রণ করা। আমি অনুক্রমগুলি একটি eachপদ্ধতির মতো কিছু পাওয়ার আশা করবো যাতে আমি চেইনটি শেষ করতে পারি .each(*.say), তবে এর মতো কোনও পদ্ধতি নেই যা আমি খুঁজে পেতে পারি। পরিবর্তে আমাকে লাইনের শুরুতে ফিরে এসে प्रीপেন্ড করতে হবে .say for। মনে হচ্ছে এটি আমার চিন্তার প্রবাহকে ভেঙে দেয়।

এটি একটি সামান্য বিরক্তিকর, তবে এটি আমাকে এ জাতীয় চমকপ্রদ ভুল হিসাবে আঘাত করেছে যা আমি ভাবছি যে আমি কোনও সহজ বিকল্প অনুপস্থিত। আমি কেবল সেইগুলিই ভাবতে পারি ».sayএবং .join("\n").sayতবে পূর্বেরগুলি উপাদানগুলির বাইরে কাজ করতে পারে (যদি আমি সঠিকভাবে বুঝতে পারি) এবং পরবর্তীগুলি একটি একক স্ট্রিং তৈরি করে যা ইনপুট তালিকার উপর নির্ভর করে সমস্যাযুক্তভাবে বড় হতে পারে।

উত্তর:


8

আপনি মন্তব্যে যেমন লিখেছেন, .map(*.say)আরএপিএল ব্যবহার করার সময় অন্য একজন সত্যিকারের মানগুলির সাথে একটি লাইনও তৈরি করে। আপনি .sinkসর্বশেষ মানচিত্রের স্টেটমেন্টের পরে পদ্ধতিটি কল করার চেষ্টা করতে পারেন ।

".".IO.dir.grep({$_.contains('e')}).map(*.uc).map(*.say).sink

আমি মনে করি ... তবে তবে আরপিএল Trueইনপুট তালিকার সমান দৈর্ঘ্যের মানগুলির একটি তালিকা ছাড়িয়ে দেবে । আদর্শ নয়।
শান 19

".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}একই কাজ করবে, তবে কেবল
REPL- তে

আমি বিশ্বাস করি যে আরইপিএল বোঝানো হচ্ছে যদি কোনও আউটপুট থাকে তবে কোনও লাইনের ফলাফল আউটপুট না দেয়; এটি কি tellকমান্ডের আগে এবং পরে ফাইলহ্যান্ডলে কল করে এবং তাদের তুলনা করে, আমি মনে করি? সুতরাং এই যুক্তি দিয়ে কিছু ভুল হতে পারে।
টিমোটিমো

11

আপনি নিজের রোল করতে পারেন।

use MONKEY;

augment class Any 
{ 
    method each( &block )
    {
        for self -> $value { 
            &block( $value );
        }
    }
};

List.^compose;
Seq.^compose;

(1, 2).each({ .say });
(2, 3).map(* + 1).each({ .say });

# 1
# 2
# 3
# 4

আপনি যদি এটি পছন্দ করেন তবে ঠিক সেখানে আপনার প্রথম সিপিএএন মডিউল সুযোগ রয়েছে।


1
সিপিএএন মডিউলটির জন্য দুর্দান্ত উত্তর এবং ধারণা। আপনি উল্লেখ করতে পারেন যে এটিকে একটি নিয়মিত সাব হিসাবে তৈরি করা যেতে পারে এবং এর সাথে ডাকা যেতে পারে .&each(), যদি তারা বৃদ্ধিতে ঝাঁকুনিতে না চায়।
user0721090601

.&each()বিন্যাসটি ব্যবহার করে ডাউনসাইডগুলি আসে, যেমন একটি একক লাইনে লেগে থাকা প্রয়োজন (বা \ পুরো জায়গা জুড়ে অযৌক্তিকভাবে ব্যবহার করুন )।
টাইল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.