রুবি ব্লকগুলির জন্য বনাম কোঁকড়া ধনুর্বন্ধনী


154

আমার এক সহকর্মী আছেন যা আমাকে সক্রিয়ভাবে বোঝানোর চেষ্টা করছে যে আমার উচিত না..আর ব্যবহার করা উচিত এবং পরিবর্তে রুবির মাল্টলাইন ব্লক সংজ্ঞায়িত করার জন্য কোঁকড়া ধনুর্বন্ধনী ব্যবহার করা উচিত।

আমি কেবল সংক্ষিপ্ত ওয়ান-লাইনারগুলির জন্য কোঁকড়ানো ধনুর্বন্ধনী ব্যবহারের শিবিরে দৃ firm়ভাবে করছি এবং অন্য সব কিছুর জন্য রাখি end তবে আমি ভেবেছিলাম যে কিছু সমাধান করার জন্য আমি বৃহত্তর সম্প্রদায়ের কাছে পৌঁছে যাব।

তাহলে এটি কোনটি এবং কেন? (কিছু কাঁটা কোড উদাহরণ)

context do
  setup { do_some_setup() }
  should "do somthing" do
    # some more code...
  end
end

অথবা

context {
  setup { do_some_setup() }
  should("do somthing") {
    # some more code...
  }
}

ব্যক্তিগতভাবে, কেবল উপরের দিকে তাকানো আমার জন্য প্রশ্নের উত্তর দেয়, তবে আমি এটি বৃহত্তর সম্প্রদায়ের জন্য খুলতে চেয়েছিলাম।


3
কেবল ভাবছি কিন্তু ব্রেস ব্যবহারের জন্য আপনার সহকর্মীদের যুক্তিগুলি কী? যুক্তিযুক্ত জিনিসের চেয়ে ব্যক্তিগত পছন্দ হিসাবে বেশি মনে হচ্ছে।
ড্যানিয়েল লি

6
আপনি যদি আলোচনা চান তবে এটিকে একটি সম্প্রদায় উইকি করুন। আপনার প্রশ্নের কাছে: এটি কেবল ব্যক্তিগত স্টাইল। আমি কোঁকড়া ধনুর্বন্ধনীগুলি আরও নার্দি দেখায় তাই পছন্দ করি।
হাফদান

7
এটি কোনও অগ্রাধিকারের বিষয় নয়, স্টাইলিস্টিক কারণে ছাড়াও একে অপরকে ব্যবহার করার সিনথেটিক কারণ রয়েছে। উত্তরের বেশ কয়েকটি কারণ ব্যাখ্যা করে। ডানটি ব্যবহার করতে ব্যর্থ হওয়ায় খুব সূক্ষ্ম বাগের কারণ হতে পারে যা অন্য কোনও "স্টাইলিস্টিক" পছন্দ পদ্ধতিতে কখনও কখনও মোড়ানোর বন্ধনী ব্যবহার করার জন্য তৈরি করা হয় কিনা তা খুঁজে পাওয়া শক্ত।
টিন ম্যান

1
"এজ শর্তগুলি" তাদের সম্পর্কে চেনে না এমন লোকদের লুকিয়ে রাখার খারাপ অভ্যাস আছে। প্রতিরক্ষামূলকভাবে কোডিংয়ের অর্থ প্রচুর পরিমাণে, কোডিং শৈলীগুলি ব্যবহার করার সিদ্ধান্ত নেওয়া সহ যা কোনও ক্ষেত্রে কেস চালানোর সম্ভাবনা হ্রাস করে। আপনি সচেতন হতে পারেন তবে উপজাতির জ্ঞান ভুলে যাওয়ার পরে আপনার পরে লোকটি দু'জন হতে পারে না। দুর্ভাগ্যক্রমে কর্পোরেট পরিবেশে এটি ঘটে থাকে।
টিন ম্যান

1
@ টিনম্যান এই ধরণের প্রান্ত শর্তগুলি টিডিডি দ্বারা পরিচালিত হয়। এই কারণেই রুবিস্ট কোডটি লিখতে এবং এই জাতীয় ত্রুটিগুলি তাদের কোডটিতে নেই বলে জেনে পুরো রাত বিশ্রাম নিতে পারেন। যখন টিডিডি বা বিডিডি দিয়ে বিকাশ করা হয় এবং অগ্রাধিকারের মধ্যে এমন ভুলকে পর্দায় দেখানো লাল করা হয় যা "আদিবাসী জ্ঞান" মনে করিয়ে দেয়। সাধারণত সমাধানটি হ'ল কোথাও বেশ কয়েকটা পেরেন যুক্ত করা যা মানক কনভেনশনগুলির মধ্যে সম্পূর্ণ গ্রহণযোগ্য। :)
ব্লেক টেলর

উত্তর:


246

সাধারণ কনভেনশনটি হ'ল মাল্টি-লাইন ব্লকগুলির জন্য do..end এবং একক লাইন ব্লকের জন্য কোঁকড়ানো ধনুর্বন্ধনী ব্যবহার করা হয় তবে এই দু'টির মধ্যে একটি পার্থক্যও রয়েছে যা এই উদাহরণ দিয়ে চিত্রিত করা যেতে পারে:

puts [1,2,3].map{ |k| k+1 }
2
3
4
=> nil
puts [1,2,3].map do |k| k+1; end
#<Enumerator:0x0000010a06d140>
=> nil

এর অর্থ end} এর চেয়ে বেশি অগ্রাধিকার রয়েছে..আর, তাই আপনি কী ব্যবহার করতে চান তা সিদ্ধান্ত নেওয়ার সময় এটি মনে রাখবেন।

PS: আপনি নিজের পছন্দগুলি বিকাশ করার সময় আরও একটি উদাহরণ মনে রাখবেন।

নিম্নলিখিত কোড:

task :rake => pre_rake_task do
  something
end

সত্যিকারের অর্থ:

task(:rake => pre_rake_task){ something }

এবং এই কোড:

task :rake => pre_rake_task {
  something
}

সত্যিকারের অর্থ:

task :rake => (pre_rake_task { something })

সুতরাং কোঁকড়া ধনুর্বন্ধনী সহ আপনি যে সত্যিকারের সংজ্ঞা চান তা পেতে, আপনাকে অবশ্যই:

task(:rake => pre_rake_task) {
  something
}

প্যারামিটারগুলির জন্য ব্রেস ব্যবহার করা আপনি যেভাবেই করতে চান এমন কিছু, তবে আপনি যদি না চান তবে এই বিভ্রান্তি এড়াতে এই ক্ষেত্রে do.end ব্যবহার করা ভাল।


44
আমি পুরো সমস্যাটিকে পাশ কাটাতে সর্বদা পদ্ধতি প্যারামিটারের আশেপাশে প্রথম বন্ধনী ব্যবহার করার পক্ষে ভোট দিই।
টিন ম্যান

@ টিন ম্যান: আপনি কি রকেলে প্রথম বন্ধনী ব্যবহার করেছেন?
অ্যান্ড্রু গ্রিম

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

8
অগ্রাধিকার ইস্যুটি দেখানোর জন্য +1। আমি চেষ্টা এবং রূপান্তর করি যখন আমি কখনও কখনও অপ্রত্যাশিত ব্যতিক্রম পেতে; শেষ {}
এপ্রিঙ্কপ্যাবস্ট

1
কেন puts [1,2,3].map do |k| k+1; endকেবল গণক অর্থাৎ একটি জিনিস মুদ্রণ করে? এখানে কি দুটি আর্গুমেন্ট পাস করা হয় না [1,2,3].mapএবং do |k| k+1; end?
বেন

55

প্রোগ্রামিং রুবি থেকে :

ধনুর্বন্ধনী একটি উচ্চতর প্রাধান্য আছে; একটি কম নজির আছে। যদি পদ্ধতিটির অনুরোধে এমন প্যারামিটার থাকে যা বন্ধনীগুলিতে আবদ্ধ থাকে না, একটি ব্লকের ব্রেস ফর্মটি সামগ্রিক অনুরোধের জন্য নয়, শেষ প্যারামিটারের সাথে আবদ্ধ হবে। ড ফর্ম অনুরোধের সাথে আবদ্ধ হবে।

সুতরাং কোড

f param {do_something()}

paramকোডের সময় ব্লকটিকে ভেরিয়েবলের সাথে সংযুক্ত করে

f param do do_something() end

ফাংশনটিতে ব্লককে বেঁধে রাখে f

তবে আপনি যদি প্রথম বন্ধনে ফাংশন আর্গুমেন্টগুলি বন্ধ করেন তবে এটি একটি নন-ইস্যু।


7
+1 "তবে যদি আপনি প্রথম বন্ধনে ফাংশন আর্গুমেন্টগুলি বন্ধ করেন তবে এটি একটি নন-ইস্যু" " আমি এটি অভ্যাসের বিষয় হিসাবে করি না বরং সুযোগ এবং দোভাষীর ঝক্কির উপর নির্ভর করে। :-)
টিন ম্যান

4
@ টিটিনম্যান, যদি আপনার দোভাষী তার পার্সারে সুযোগটি ব্যবহার করেন তবে আপনার একটি নতুন দোভাষী দরকার।
পল ড্রাগার

@ পলড্রাপার - সত্যই, তবে সমস্ত ভাষা এই বিষয়ে একমত নয়। তবে (আমি মনে করি) প্যারেনদের পক্ষে "তাদের কাজটি না করা" খুব বিরল তাই প্যারেনসকে সর্বজনীনভাবে ব্যবহার করা আপনাকে ভাষা ডিজাইনারদের দ্বারা করা "এলোমেলো" সিদ্ধান্তগুলি মনে রাখার হাত থেকে বাঁচায় - এমনকি সংকলক এবং দোভাষীদের প্রয়োগকারীরা যদি তাদের বিশ্বস্তভাবে কার্যকর করা হয় তবে ।
dl

15

এ সম্পর্কে কয়েকটি দৃষ্টিভঙ্গি রয়েছে, এটি সত্যই ব্যক্তিগত পছন্দের বিষয়। অনেক রুবিবাদী আপনার মতামত গ্রহণ করে। তবে দুটি সাধারণ শৈলীর মধ্যে প্রচলিত একটি হ'ল সর্বদা একটি বা অন্যটি ব্যবহার করা বা {}মানগুলি ফেরত do ... endদেওয়া ব্লকগুলির জন্য এবং পার্শ্ব প্রতিক্রিয়াগুলির জন্য কার্যকর করা ব্লকগুলির জন্য ব্যবহার করা।


2
এটি কেবল ব্যক্তিগত পছন্দের বিষয় নয়। প্যারামিটারের বাঁধাই সূক্ষ্ম বাগের কারণ হতে পারে যদি পদ্ধতি প্যারামগুলি বন্ধনীতে আবদ্ধ না হয়।
টিন ম্যান

1
আমি বর্তমানে শেষ বিকল্পটি করছি না, তবে কিছু লোক এই পদ্ধতিটি গ্রহণ করেছে উল্লেখ করার জন্য আমি +1-ইন করছি।
অ্যান্ড্রু গ্রিম

অ্যাভডি গ্রিম একটি ব্লগ পোস্টে এর পক্ষে আইনজীবী: devblog.avdi.org/2011/07/26/…
অ্যালেক্সান্ডার

8

কোঁকড়া ধনুর্বন্ধনীগুলির মধ্যে একটি বড় সুবিধা রয়েছে - অনেকগুলি সম্পাদকের কাছে নির্দিষ্ট সময়ের ধরণের ডিবাগিংকে আরও সহজ করে তুলতে তাদের সাথে মিলে যাওয়ার অনেক বেশি সহজ সময় থাকে। এদিকে, "ডু ... শেষ" কীওয়ার্ডটি মেলানো বেশ খানিকটা শক্ত, বিশেষত যেহেতু "শেষ" গুলি "যদি" এর সাথেও "মেলে"।


উদাহরণস্বরূপ do ... end
রুবিমাইন

1
আমি ধনুর্বন্ধনী পছন্দ করি না কেন, আমি কোনও কারণ দেখতে পাচ্ছি না যে কোনও সম্পাদকের একক অক্ষর বনাম 2/3 চরিত্রের স্ট্রিং খুঁজে পেতে সমস্যা হয়। যদিও এমন যুক্তি রয়েছে যে বেশিরভাগ সম্পাদক ইতিমধ্যে ব্রেসগুলির সাথে মেলে, তবে do ... endএকটি বিশেষ ক্ষেত্রে এটির জন্য ভাষা নির্দিষ্ট যুক্তি প্রয়োজন।
চিনোটো ভোক্রো

7

আমি যে সর্বাধিক প্রচলিত নিয়মটি দেখেছি (অতি সম্প্রতি এলোভেন্ট রুবিতে ) তা হল:

  • যদি এটি কোনও মাল্টি-লাইন ব্লক হয় তবে do / end ব্যবহার করুন
  • যদি এটি একক লাইনের ব্লক হয় তবে {use ব্যবহার করুন

7

আমি কর / শেষের জন্য ভোট দিচ্ছি


কনভেনশনটি do .. endমাল্টলাইন এবং জন্য{ ... } ওয়ান-লাইনারগুলির জন্য।

তবে আমি do .. endআরও ভাল পছন্দ করি, সুতরাং যখন আমার কাছে একটি লাইন থাকে তখন আমি do .. endযাইহোক ব্যবহার করি তবে তিনটি লাইনে কর / শেষের জন্য এটি যথারীতি বিন্যাস করি। এটি সবাইকে খুশি করে।

  10.times do 
    puts ...
  end

একটি সমস্যা { }হ'ল এটি কবিতা-মোড-বৈরী (কারণ তারা শেষ প্যারামিটারটিতে দৃly়ভাবে আবদ্ধ হয় এবং পুরো পদ্ধতি কল নয়, সুতরাং আপনাকে অবশ্যই পদ্ধতি প্যারেন্স অন্তর্ভুক্ত করতে হবে) এবং এগুলি কেবল আমার মতে, দেখতে সুন্দর লাগে না। এগুলি বিবৃতি-গোষ্ঠী নয় এবং পাঠযোগ্যতার জন্য তারা হ্যাশ কনস্ট্যান্টের সাথে সংঘর্ষে লিপ্ত।

এছাড়াও, আমি { }সি প্রোগ্রামগুলিতে যথেষ্ট দেখেছি । রুবির উপায়, যথারীতি, আরও ভাল। ঠিক এক ধরণের ifব্লক রয়েছে এবং আপনাকে কখনই ফিরে যেতে হবে না এবং কোনও বিবৃতিকে যৌগিক-বিবৃতিতে রূপান্তর করতে হবে না।


2
"আমি সি প্রোগ্রামগুলিতে যথেষ্ট পরিমাণে" "দেখেছি" ... এবং পার্ল। এবং, সেখানে বেশ কয়েকটি বিবৃতি দেওয়ার জন্য এবং রুবির জেনের মতো কোডিং শৈলীর পক্ষে পরামর্শ দেওয়ার জন্য +1। :-)
টিন ম্যান

1
কড়া কথায় বলতে গেলে আরও একটি "যদি" সিনট্যাক্স - পোস্টফিক্স "যদি" ( do_stuff if x==1) থাকে, যা নিয়মিত বাক্যবিন্যাসে রূপান্তরিত করা এক প্রকার বিরক্তিকর। তবে সেটা অন্য আলোচনা।
কেলভিন

উপসর্গ if, পোস্টফিক্স if, পোস্টফিক্স unless(এছাড়াও এক ধরণের if, একটি যদি-না) এবং এর সাথে একটি লাইন ifরয়েছে then। রুবি উপায়টি হ'ল বাস্তবে এমন কিছু প্রকাশ করার প্রচুর উপায় রয়েছে যা সি খুব সহজ, কঠোর নিয়ম অনুসরণ করে যা দিচ্ছে তার চেয়ে অনেক খারাপ।
মক্কি

2
সুতরাং আমরা যদি সিতে like like পছন্দ করি, তার মানে আমাদেরও সেগুলি রুবিতে ব্যবহার করা উচিত?
ওয়ারেন শিশ 18

6

কয়েকজন প্রভাবশালী রুবিবাদীরা আপনি যখন রিটার্ন মানটি ব্যবহার করেন তখন বন্ধনী ব্যবহার করার পরামর্শ দেন এবং যখন না করেন তখন / শেষ করেন।

http://talklikeaduck.denhaven2.com/2007/10/02/ruby-blocks-do-or-brace (সংরক্ষণাগার.org এ)

http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc (সংরক্ষণাগার.org এ)

এটি সাধারণভাবে একটি ভাল অনুশীলনের মতো বলে মনে হচ্ছে।

আমি এই নীতিটিটি কিছুটা সংশোধন করে বললাম যে আপনার একক লাইনে ডু / এন্ড ব্যবহার করা এড়ানো উচিত কারণ এটি পড়া শক্ত।

ধনুর্বন্ধনী ব্যবহার করে আপনাকে আরও সতর্কতা অবলম্বন করতে হবে কারণ এটি পুরো পদ্ধতি কলের পরিবর্তে কোনও পদ্ধতির চূড়ান্ত পরমকে আবদ্ধ করবে। এটি এড়াতে কেবল বন্ধনী যুক্ত করুন।


2

আসলে এটি একটি ব্যক্তিগত পছন্দ, কিন্তু এই বলে যে, আমার রুবি অভিজ্ঞতার বিগত 3 বছর যা আমি শিখেছি তা হ'ল রুবি এর স্টাইল রয়েছে।

একটি উদাহরণ হ'ল, আপনি যদি জাভা পটভূমি থেকে আগত হন তবে বুলিয়ান পদ্ধতির জন্য আপনি ব্যবহার করতে পারেন

def isExpired
  #some code
end 

উটের কেসটি লক্ষ্য করুন এবং প্রায়শই এটি 'বুলিয়ান পদ্ধতি হিসাবে সনাক্ত করার জন্য উপসর্গ' থাকে।

রুবি বিশ্বে একই পদ্ধতি হবে

def expired?
  #code
end

সুতরাং আমি ব্যক্তিগতভাবে মনে করি, 'রুবি ওয়ে' দিয়ে চলাই ভাল (তবে আমি জানি যে এটি বুঝতে কিছু সময় লাগে (এটি আমার প্রায় 1 বছর সময় নিয়েছিল: ডি))।

অবশেষে, আমি সাথে যেতে হবে

do 
  #code
end

ব্লক।


2

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

module I18n
    extend Module.new {
        old_translate=I18n.method(:translate)
        define_method(:translate) do |*args|
            InplaceTrans.translate(old_translate, *args)
        end
        alias :t :translate
    }
end

module InplaceTrans
    extend Module.new {
        def translate(old_translate, *args)
            Translator.new.translate(old_translate, *args)
        end
    }
end

তারপরে আমি কিছু কোড সুন্দরী করলাম ...

#this code is wrong!
#just made it 'better looking'
module I18n
    extend Module.new do
        old_translate=I18n.method(:translate)
        define_method(:translate) do |*args|
            InplaceTrans.translate(old_translate, *args)
        end
        alias :t :translate
    end
end

যদি আপনি {}এখানে এটিকে পরিবর্তন করেন do/endতবে ত্রুটিটি পাবেন, সেই পদ্ধতিtranslate বিদ্যমান নেই ...

কেন এটি ঘটে তা এখানে একের বেশি উল্লেখ করা হয় - প্রাধান্য। তবে এখানে বন্ধনী কোথায় রাখব? (@ টিন ম্যান: আমি সর্বদা আপনার মতো ধনুর্বন্ধনী ব্যবহার করি তবে এখানে ... তদারকি করা)

সুতরাং প্রতিটি উত্তর মত

If it's a multi-line block, use do/end
If it's a single line block, use {}

ঠিক ভুল"বুট্রেস / অগ্রাধিকারের দিকে নজর রাখুন!" ব্যতীত যদি এটি ব্যবহার করা !

আবার

extend Module.new {} evolves to extend(Module.new {})

এবং

extend Module.new do/end evolves to extend(Module.new) do/end

(প্রসারিতের ফলাফলটি ব্লকটির সাথে কী ঘটবে ...)

সুতরাং আপনি যদি ড / এন্ড ব্যবহার করতে চান তবে এটি ব্যবহার করুন:

#this code is ok!
#just made it 'better looking'?
module I18n
    extend(Module.new do 
        old_translate=I18n.method(:translate)
        define_method(:translate) do |*args|
            InplaceTrans.translate(old_translate, *args)
        end
        alias :t :translate
    end)
end

1

ব্যক্তিগত পক্ষপাত্রে নেমে আসে, আমি ডো / এন্ড ব্লকের চেয়ে কোঁকড়া ধনুর্বন্ধকে পছন্দ করি কারণ এটি বেশিরভাগ পটভূমির ভাষার কারণে ডু / এন্ড কনভেনশনে তাদের ব্যবহার করে উচ্চতর সংখ্যক বিকাশকারীদের কাছে এটি বোধগম্য। এর সাথে বলা হচ্ছে যে আসল কীটি আপনার দোকানের মধ্যে একটি চুক্তিতে আসতে হবে, যদি প্রত্যেকের চেয়ে /10/১০ বিকাশকারীরা কর / শেষ ব্যবহার করে থাকেন তবে যদি /10/১০ কোঁকড়া ধনুর্বন্ধনী ব্যবহার করে, তবে সেই দৃষ্টান্তটি আটকে দিন।

এটি একটি নকশাগুলি তৈরির বিষয়ে যাতে পুরো দলটি কোড কাঠামোকে আরও দ্রুত সনাক্ত করতে পারে।


3
এটি পছন্দের চেয়ে বেশি। দুজনের মধ্যে বাইন্ডিং আলাদা এবং সমস্যাগুলি হতে পারে যা নির্ণয় করা শক্ত। উত্তরের বেশ কয়েকটি সমস্যার বিবরণ দেয়।
টিন ম্যান

4
অন্যান্য ভাষার পটভূমির লোকদের ক্ষেত্রে - আমি মনে করি "বিবেচনাযোগ্যতা" এর মধ্যে পার্থক্যটি বিবেচনার পরোয়ানা না পাওয়ার ক্ষেত্রে এই ক্ষেত্রে এত ছোট is (এটি আমার নিম্ন বিটিডব্লিউ ছিল না))
কেলভিন

1

তাদের মধ্যে একটি সূক্ষ্ম পার্থক্য আছে, কিন্তু do do কর / শেষের চেয়ে শক্ত করে বাঁধা।


0

আমার ব্যক্তিগত স্টাইলটি হ'ল {... }বনাম do... endপছন্দের কঠোর নিয়মগুলির উপর পঠনযোগ্যতার উপর জোর দেওয়া , যখন এই জাতীয় পছন্দ সম্ভব হয়। আমার পাঠযোগ্যতার ধারণাটি নিম্নরূপ:

[ 1, 2, 3 ].map { |e| e + 1 }      # preferred
[ 1, 2, 3 ].map do |e| e + 1 end   # acceptable

[ 1, 2, 3 ].each_with_object [] do |e, o| o << e + 1 end # preferred, reads like a sentence
[ 1, 2, 3 ].each_with_object( [] ) { |e, o| o << e + 1 } # parens make it less readable

Foo = Module.new do     # preferred for a multiline block, other things being equal
  include Comparable
end

Foo = Module.new {      # less preferred
  include Comparable
}

Foo = Module.new { include Comparable }      # preferred for a oneliner
Foo = module.new do include Comparable end   # imo less readable for a oneliner

[ [ 1 ], [ 1, 2 ] ].map { |e| e.map do |e| e + 1 end }  # slightly better
[ [ 1 ], [ 1, 2 ] ].map { |e| e.map { |e| e + 1 } }     # slightly worse

আরও জটিল সিনট্যাক্সে যেমন মাল্টলাইন নেস্টেড ব্লকগুলিতে, আমি বেশিরভাগ প্রাকৃতিক ফলাফলের জন্য ছেদ করার চেষ্টা করি {... }এবং do... endডিলিমিটারগুলি, যেমন।

Foo = Module.new { 
  if true then
    Bar = Module.new {                          # I intersperse {} and keyword delimiters
      def quux
        "quux".tap do |string|                  # I choose not to intersperse here, because
          puts "(#{string.size} characters)"    # for multiline tap, do ... end in this
        end                                     # case still loks more readable to me.
      end
    }
  end
}

যদিও অনমনীয় নিয়মের অভাব বিভিন্ন প্রোগ্রামারদের জন্য খুব সহজেই আলাদা আলাদা আলাদা পছন্দ তৈরি করতে পারে, আমি বিশ্বাস করি যে পাঠ্যতার ক্ষেত্রে কেস-বাই-কেস অপ্টিমাইজেশন, যদিও সাবজেক্টিভ, কঠোর নিয়ম মেনে চলা একটি নেট লাভ gain


1
পাইথন থেকে আগত, সম্ভবত আমার রুবিকে এড়িয়ে যাওয়া উচিত এবং পরিবর্তে উইসপ শিখতে হবে।
সিস টিমারম্যান

আমি বিশ্বাস করি Rubyযে সেখানে সর্বোত্তম ব্যবহারিক ভাষা ছিল। আমি স্ক্রিপ্টিং ভাষা বলতে হবে। আজ, আমি মনে করি আপনি সমানভাবে পড়াশুনা করতেন Brainfuck
বোরিস স্ট্যাটনিকি

0

আমি এখানে সবচেয়ে বেশি ভোট দেওয়া উত্তরের উদাহরণ নিলাম। বলুন,

[1,2,3].map do 
  something 
end

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

Invokes the given block once for each element of self.

def map(*several_variants)
    (yield to_enum.next).to_enum.to_a
end

অর্থাত্ এটি কোডের একটি ব্লক গ্রহণ করে - যা করা এবং শেষের মধ্যে যা কিছু থাকে তা ফলন হিসাবে কার্যকর করা হয়। তারপরে ফলাফলটি আবার অ্যারে হিসাবে সংগ্রহ করা হবে, সুতরাং এটি সম্পূর্ণ নতুন অবজেক্টটি ফিরে আসবে।

সুতরাং যখনই আপনি কোনও ড -এন্ড ব্লক বা { encounter এর মুখোমুখি হন , কেবল মনের মানচিত্র রাখুন যে কোডের ব্লকটি প্যারামিটার হিসাবে পাস হচ্ছে, যা অভ্যন্তরীণভাবে কার্যকর হবে।


-3

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

আরও ভাল, রুবি হ্যাক করুন এটি একটি পতাকা।

অবশ্যই, "আপনার লড়াইগুলি বেছে নিন" সহজ সমাধান হল স্টাইলের কনভেনশনটি গ্রহণ করা যা শেষের ক্রম সমস্ত একই লাইনে উপস্থিত হয় এবং আপনার বাক্য গঠনকে নিঃশব্দ করতে শেখায়। সম্পাদনা সহজ করার জন্য, এই ক্রমগুলি প্রসারিত / সঙ্কুচিত করতে কেউ সম্পাদক স্ক্রিপ্ট ব্যবহার করতে পারে।

আমার রুবি কোড লাইনগুলির 20% থেকে 25% তাদের নিজস্ব লাইনে "শেষ" হয়, সমস্তই আমার ইনডেন্টেশন কনভেনশন দ্বারা তুচ্ছভাবে অনুমিত হয়। রুবি হ'ল লিস্পের মতো ভাষা যা সর্বাধিক সাফল্য অর্জন করেছে। লোকেরা যখন এই বিষয়ে বিতর্ক করে, সমস্ত ভয়াবহ প্রথম বন্ধনীগুলি কোথায় তা জিজ্ঞাসা করে, আমি তাদের অনাবৃত "শেষ" এর সাত লাইনে শেষ হওয়া একটি রুবি ফাংশনটি দেখি।

বেশিরভাগ বন্ধনী অনুমান করার জন্য আমি কয়েক বছর ধরে একটি লিস্প প্রিপ্রোসেসর ব্যবহার করে কোড করেছি: একটি বার '|' লাইনের শেষে অটোোক্লোজিত এমন একটি গোষ্ঠী খোলা হয়েছে এবং একটি ডলারের চিহ্ন '$' খালি স্থানধারক হিসাবে পরিবেশন করেছে যেখানে অন্যথায় গ্রুপিংগুলি অনুমান করতে কোনও চিহ্ন থাকবে না। এটি অবশ্যই ধর্মীয় যুদ্ধের অঞ্চল। প্রথম বন্ধন ছাড়াই লিস্প / স্কিম সমস্ত ভাষার সর্বাধিক কাব্যিক। তবুও সিনট্যাক্স রঙ ব্যবহার করে বন্ধনী বন্ধ করা সহজ।

আমি এখনও হাস্কেলের প্রিপ্রোসেসরের সাথে কোড করি, হেরেডোকগুলি যুক্ত করতে এবং মন্তব্য হিসাবে সমস্ত ফ্লাশ লাইনগুলিকে ডিফল্ট করতে, কোড হিসাবে সমস্ত কিছু যুক্ত হয় everything ভাষাগুলি যাই হোক না কেন আমি মন্তব্য চরিত্রগুলি অপছন্দ করি।

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