শৃঙ্খলিত পদ্ধতিতে কারী করার সমতুল্য প্রতি পদ্ধতিতে মাত্র একটি পরামিতি প্রয়োজন?


15

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

উত্তর:


14

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

জাভাতে, মেথড চেইনিংয়ের মতো:

String myString = new StringBuilder("Hi ").append(firstName)
                                          .append(" ")
                                          .append(lastName)
                                          .append("!")
                                          .toString();

সুতরাং, এই সমস্ত .append () পদ্ধতি কলগুলির প্রত্যেকটি বেনামে স্ট্রিংবিল্ডার অবজেক্টকে একটি পয়েন্টার দেয়। এই অবজেক্টটি প্রতিটি .append () পরে সম্পূর্ণ হয় এবং এটি কোনও ফাংশন নয়।

বিপরীতে, স্কালায় আংশিক প্রয়োগ বা কারিরিং এর মতো:

def simple(x:Int, y:Int, z:Int) = x * (y + z)
val simpler = simple(2, _:Int, _:Int)
simpler(3, 4) => 14

( ড্যানিয়েল ইয়ানকোভস্কির ব্লগ থেকে নেওয়া নমুনা )

simpler()এই উদাহরণে একটি মোড়ক-ফাংশন simple()simpler()এটি এখনও এমন একটি ফাংশন যা নিজেই আরও সীমিত সংস্করণ ছাড়া অন্য কোনও কিছুতে মূল্যায়ন করার আগে আরও পরামিতি নেয়।

সম্পাদনা: একদিন পরে এটি পড়া, আমি "র‌্যাপার-ফাংশন" কী বলে মনে করি। কার্পিং বা আংশিক অ্যাপ্লিকেশন জাভাতে মোড়কের পদ্ধতিগুলির সাথে সেরা সিমুলেট করা যেতে পারে।

public interface Simpler {
    public int apply(int y, int z);
}

public class Simple {
    public int apply(int x, int y, int z) { return x * (y + z); }

    public Simpler partiallyApply(final int x) {
        final simple = this;
        return new Simpler() {
            @Override
            public int apply(int y, int z) {
                // x is the final int parameter to partiallyApply()
                simple.apply(x, y, z);
            }
        }
    }
}

: শেষ-সম্পাদনা

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

"বিল্ডার" ডিজাইন প্যাটার্ন এবং জাভা 8- এ নতুন সংগ্রহ লাইব্রেরি ইন্টারফেসগুলির সাথে সম্পন্ন যেমন অলস মূল্যায়নের মতো কিছু বাস্তবায়নের জন্য পদ্ধতি শৃঙ্খলা প্রায়শই ব্যবহৃত হয় ।

আমি আশা করি এটি সাহায্য করবে.


+1: আমি এটি জানতাম, তবে আমি মনে করি না আপনি যেমনটি করেছিলেন তেমন কাছাকাছি কোথাও আমি এটি উচ্চারণ করতে পারতাম।
পিটার রোয়েল

সুন্দরভাবে ব্যাখ্যা করা হয়েছে, আপনার সমস্যার জন্য এখানে একটি সবুজ চেকমার্ক এবং উত্সাহ দেওয়া হয়েছে।
ওয়ার্ল্ড ইঞ্জিনিয়ার

স্ট্রিংবিল্ডারের খুব সুন্দর উদাহরণ সম্পর্কে প্রশ্ন - toString()কল ব্যতীত আমরা কার্যকরভাবে আমাদের কলটিতে কারি করার উদ্দেশ্যটি প্রতিলিপি করছি না? আমি কেবল ওও তে কারি করার ধারণাটি পাওয়ার চেষ্টা করছি।
শ্রীধর সারনোবাত

1
@ শ্রীধর-সারনোব্যাট একটি ত্রিযুক্ত ফাংশন কম পরামিতি সহ অন্য ফাংশন প্রদান করে। মুছে ফেলা প্যারামিটারগুলি ফাংশনটিতে অভ্যন্তরীণ স্থিতিতে পরিণত হয়। কিছু বস্তুকে জাভা 8-তে ফাংশনের মতো চিকিত্সা করা হয় যা এটিকে বিভ্রান্ত করতে পারে তবে স্ট্রিংবিল্ডার তাদের মধ্যে একটি নয়। হুম, স্ট্রিংবিল্ডারের মধ্যে, append(charSeq)ফাংশনটি ফাংশনটির একটি কৌতুকযুক্ত ফর্ম insert(destOffset, charSeq)যেখানে destOffsetস্ট্রিংবিল্ডারের দৈর্ঘ্য সর্বদা থাকে।
গ্লেনপিটারসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.