ruby - table - html tags pdf




লাম্বদা কখন ব্যবহার করবেন, কখন ব্যবহার করবেন? (10)

রুবি ১.৮-তে, একদিকে Proc.new / Proc.new এবং অন্যদিকে Proc.new মধ্যে সূক্ষ্ম পার্থক্য রয়েছে।

  • এই পার্থক্য কি?
  • কোনটি বেছে নেবেন সে সম্পর্কে কীভাবে আপনি গাইডলাইন দিতে পারেন?
  • রুবি ১.৯-এ, প্রোক এবং ল্যাম্বদা পৃথক। চুক্তিটি কি ছিল?

অ্যাকর্ডিয়ান গায়ের প্রতিক্রিয়াটি বিস্তারিতভাবে জানাতে:

লক্ষ্য করুন যে Proc.new একটি ব্লক পাস করে একটি Proc.new আউট তৈরি করে। আমি বিশ্বাস করি যে lambda {...} একটি ব্লক পেরিয়ে যাওয়া একটি মেথড কলের চেয়ে শাব্দিকের ধরণের হিসাবে পার্স করা হয়েছে। কোনও মেথড কলের সাথে সংযুক্ত ব্লকের অভ্যন্তরে ফিরে আসা পদ্ধতি থেকে ফিরে আসবে, ব্লকটি নয়, এবং Proc.new একটি উদাহরণ।

(এটি 1.8 I আমি জানি না এটি কীভাবে 1.9 এ অনুবাদ করে)


আমি এই পৃষ্ঠাটি পেয়েছি যা Proc.new এবং Proc.new মধ্যে পার্থক্য কী তা দেখায়। পৃষ্ঠা অনুসারে, কেবলমাত্র পার্থক্যটি হ'ল যে একটি ল্যাম্বডা Proc.new আর্গুমেন্ট গ্রহণ করে সে সম্পর্কে কঠোর, যেখানে Proc.new অনুপস্থিত যুক্তিগুলিকে nil রূপান্তরিত করে। পার্থক্যটি চিত্রিত করে এখানে একটি উদাহরণ আইআরবি সেশন:

irb(main):001:0> l = lambda { |x, y| x + y }
=> #<Proc:[email protected](irb):1>
irb(main):002:0> p = Proc.new { |x, y| x + y }
=> #<Proc:[email protected](irb):2>
irb(main):003:0> l.call "hello", "world"
=> "helloworld"
irb(main):004:0> p.call "hello", "world"
=> "helloworld"
irb(main):005:0> l.call "hello"
ArgumentError: wrong number of arguments (1 for 2)
    from (irb):1
    from (irb):5:in `call'
    from (irb):5
    from :0
irb(main):006:0> p.call "hello"
TypeError: can't convert nil into String
    from (irb):2:in `+'
    from (irb):2
    from (irb):6:in `call'
    from (irb):6
    from :0

পৃষ্ঠাটি ল্যাম্বডা ব্যবহারের প্রস্তাব দিচ্ছে যদি না আপনি বিশেষত ত্রুটি সহনশীল আচরণ চান। আমি এই অনুভূতির সাথে একমত ল্যাম্বডা ব্যবহার করা বাচ্চাকে আরও সংক্ষিপ্ত বলে মনে হয় এবং এ জাতীয় একটি তুচ্ছ পার্থক্যের সাথে, এটি গড় পরিস্থিতিতে আরও ভাল পছন্দ বলে মনে হয়।

রুবি ১.৯-এর জন্য, দুঃখিত, আমি এখনও ১.৯ এর দিকে নজর দিইনি, তবে আমি তারা কল্পনাও করি না যে তারা এগুলি এতটাই বদলে ফেলবে (যদিও আমার কথাটি এর জন্য নিবেন না, মনে হয় আপনি কিছু পরিবর্তন শুনেছেন, তাই) আমি সম্ভবত সেখানে ভুল)।


আরও ব্যাখ্যা প্রদান করতে:

জো বলেছেন যে Proc.new ফিরে আসার আচরণটি অবাক করার মতো। তবে আপনি যখন বিবেচনা করেন যে প্রোকনিউ একটি ব্লকের মতো আচরণ করে এটি অবাক হওয়ার মতো বিষয় নয় যে ঠিক ব্লকগুলি কীভাবে আচরণ করে। অন্যদিকে ল্যাম্বাস আরও পদ্ধতির মতো আচরণ করে।

এটি প্রকৃতপক্ষে ব্যাখ্যা করে যে লাম্বদা না থাকাকালীন যখন আরিটি (আর্গুমেন্টের সংখ্যা) আসে তখন প্রোকস কেন নমনীয়। ব্লকগুলি তাদের সমস্ত যুক্তি সরবরাহ করার প্রয়োজন হয় না তবে পদ্ধতিগুলি করে (যদি না কোনও ডিফল্ট সরবরাহ না করা হয়)। লাম্বদা আর্গুমেন্ট ডিফল্ট সরবরাহ করা রুবি ১.৮-এ কোনও বিকল্প নয়, এখন এটি রুবি ১.৯ এ বিকল্প ল্যাম্বদা সিনট্যাক্স (ওয়েবম্যাট দ্বারা উল্লিখিত) সহ সমর্থিত:

concat = ->(a, b=2){ "#{a}#{b}" }
concat.call(4,5) # => "45"
concat.call(1)   # => "12"

এবং মিচিয়েল ডি মেরে (ওপি) প্রোকস এবং ল্যাম্বদা রুবি ১.৯-তে বিনয়ের সাথে একই আচরণ করছেন সম্পর্কে ভুল। আমি যাচাই করেছি যে তারা এখনও উপরে বর্ণিত 1.8 থেকে আচরণটি বজায় রাখে।

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

next , redo এবং উত্স এবং ল্যাম্বডাস উভয় ক্ষেত্রে একই আচরণ করুন। তবে উভয় ক্ষেত্রে retry অনুমতি নেই এবং এটি ব্যতিক্রম বাড়াবে।

এবং পরিশেষে, proc পদ্ধতিটি কখনই ব্যবহার করা উচিত নয় কারণ এটি অসঙ্গত এবং অপ্রত্যাশিত আচরণ রয়েছে। রুবি ১.৮ এ এটি আসলে একটি লাম্বদা ফেরত দেয়! রুবি ১.৯ এ এটি স্থির করা হয়েছে এবং এটি একটি প্রককে প্রদান করে। আপনি যদি Proc.new তৈরি করতে চান তবে Proc.new দিয়ে Proc.new

আরও তথ্যের জন্য, আমি ও'রিলির দ্য রুবি প্রোগ্রামিং ল্যাঙ্গুয়েজকে অত্যন্ত পরামর্শ দিচ্ছি যা এই তথ্যের বেশিরভাগ জন্য আমার উত্স।


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


প্রোকটি বয়স্ক, তবে প্রত্যাবর্তনের শব্দার্থকতা আমার কাছে অত্যন্ত বিপরীত (কমপক্ষে আমি যখন ভাষা শিখছিলাম) কারণ:

  1. আপনি যদি প্রোক ব্যবহার করছেন তবে আপনি সম্ভবত কোনও ধরণের কার্যকরী দৃষ্টান্ত ব্যবহার করছেন।
  2. প্রোক ঘেরের সুযোগ থেকে ফিরে আসতে পারে (পূর্ববর্তী প্রতিক্রিয়াগুলি দেখুন), যা মূলত একটি গোটো এবং প্রকৃতির অত্যন্ত কার্যক্ষম নয়।

ল্যাম্বদা কার্যকরীভাবে সুরক্ষিত এবং এর পক্ষে যুক্তিযুক্তভাবে সহজ - আমি সবসময় এটি প্রোকের পরিবর্তে ব্যবহার করি।


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

def foo
  proc = Proc.new{return}
  foobar(proc)
  puts 'foo'
end

def foobar(proc)
  proc.call
  puts 'foobar'
end

foo

যদিও foobar , এটি foobar তৈরি হয়েছিল এবং সুতরাং foobar return না। চার্লস ক্যালওয়েল যেমন উপরে লিখেছেন, এটিতে এটির একটি খুব অনুভূতি রয়েছে। আমার মতে, রিটার্নটি এমন একটি ব্লকে ঠিক আছে যা এর লেজিকাল প্রসঙ্গে কার্যকর করা হয়, তবে যখন কোনও প্রসঙ্গে ব্যবহার করা হয় যা অন্য প্রসঙ্গে প্রয়োগ করা হয় তখন এটি অনেক কম স্বজ্ঞাত হয়।


ল্যাম্বদা দিয়ে তৈরি প্রোস এবং প্রোস.নেউ দিয়ে তৈরি প্রসগুলির মধ্যে আরেকটি গুরুত্বপূর্ণ তবে সূক্ষ্ম পার্থক্য হ'ল তারা কীভাবে return বিবৃতি পরিচালনা করে:

  • একটি lambda প্রক্টে, return স্টেটমেন্টটি কেবল প্রাক থেকে আসে
  • Proc.new , return স্টেটমেন্টটি আরও Proc.new অবাক করা: এটি কেবল Proc.new , Proc.new পদ্ধতি থেকেও নিয়ন্ত্রণ ফিরে দেয়!

এখানে lambda ক্র্যাকেটেড প্র্যাকের ক্রিয়াকলাপের return । এটি এমনভাবে আচরণ করে যা আপনি সম্ভবত আশা করেন:

def whowouldwin

  mylambda = lambda {return "Freddy"}
  mylambda.call

  # mylambda gets called and returns "Freddy", and execution
  # continues on the next line

  return "Jason"

end


whowouldwin
#=> "Jason"

এখন এখানে একটি Proc.new একই জিনিস করছেন return আপনি সেই ক্ষেত্রে একটির মতো দেখতে পাচ্ছেন যেখানে রুবি সবচেয়ে স্বল্প বিস্ময়ের নীতিটি ভেঙে দিয়েছে:

def whowouldwin2

  myproc = Proc.new {return "Freddy"}
  myproc.call

  # myproc gets called and returns "Freddy", 
  # but also returns control from whowhouldwin2!
  # The line below *never* gets executed.

  return "Jason"

end


whowouldwin2         
#=> "Freddy"

এই বিস্ময়কর আচরণের জন্য (পাশাপাশি কম টাইপিং) ধন্যবাদ, আমি Proc.new সময় Proc.new ব্যবহার করে Proc.new পছন্দ করি।


সংক্ষিপ্ত উত্তর: কী গুরুত্বপূর্ণ তা return করে: ল্যাম্বদা নিজে থেকে ফিরে আসে এবং প্র্যাকটি নিজে থেকে ফিরে আসে এবং যে ক্রিয়াকলাপটি এটি বলে।

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

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

আপনি যদি লুপ, যদি-অন্য নির্মাণগুলি ইত্যাদির মতো নতুন ভাষাগুলি তৈরি করে থাকেন তবে আপনার কেবল এটির প্রয়োজন হবে You



return সাথে আচরণের পার্থক্য হ'ল আইএমএইচও 2 এর মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্য I আমি ল্যাম্বডাকেও পছন্দ করি কারণ এটি প্রোক.নেউ :-) এর চেয়ে কম টাইপ করে ing







proc