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