রুবি পদ্ধতিতে উদ্দীপনা চিহ্নগুলি কেন ব্যবহার করা হয়?


540

রুবিতে কিছু পদ্ধতির একটি প্রশ্ন চিহ্ন থাকে ( ?) যা এই জাতীয় একটি প্রশ্ন include?জিজ্ঞাসা করে যদি প্রশ্নে থাকা বস্তুটি অন্তর্ভুক্ত থাকে তবে এটি সত্য / মিথ্যা ফিরিয়ে দেয়।

তবে কেন অন্য কয়েকটি পদ্ধতিতে বিস্ময়কর চিহ্ন রয়েছে ( !) যেখানে অন্যরা নেই?

এর মানে কী?


21
প্রতিশব্দ: ঠুং শব্দ,
উদ্দীপনা

17
গৃহীত উত্তরটি স্ট্যাকওভারফ্লো . com/a/612653/109618 এ পরিবর্তন করা উচিত । Wobblini.net/bang.txt এবং রুবি- forum.com/topic/176830#773946 দেখুন - "ব্যাং সাইন মানে" ব্যাং সংস্করণটি এর নন ব্যাংয়ের তুলনায় আরও বিপজ্জনক; যত্ন সহকারে পরিচালনা করুন "" -ম্যাটজ
ডেভিড জে

2
ঠুং ঠুং শব্দটি একটি দুর্দান্ত নকশা পছন্দ হবে যদি কেবল এবং সমস্ত ঠ্যাং পদ্ধতি বিপজ্জনক ছিল। দুঃখজনকভাবে তারা না, এবং তাই এটি যা পরিবর্তনীয় এবং কী তা মুখস্থ করার ক্ষেত্রে হতাশার মহড়া হয়ে ওঠে।
ড্যামিয়েন রোচে

উত্তর:


617

সাধারণভাবে, যে পদ্ধতিগুলি শেষ হয় !সেগুলি নির্দেশ করে যে পদ্ধতিটি যার দিকে ডেকেছে সেটিকে পরিবর্তন করবে । রুবি এগুলিকে " বিপজ্জনক পদ্ধতি " হিসাবে অভিহিত করে কারণ তারা এমন পরিবর্তন করে যে অন্য কারও কাছে রেফারেন্স থাকতে পারে। স্ট্রিংগুলির জন্য এখানে একটি সাধারণ উদাহরণ:

foo = "A STRING"  # a string called foo
foo.downcase!     # modifies foo itself
puts foo          # prints modified foo

এটি আউটপুট দেবে:

a string

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

foo = "A STRING"    # a string called foo
bar = foo.downcase  # doesn't modify foo; returns a modified string
puts foo            # prints unchanged foo
puts bar            # prints newly created bar

এই ফলাফলগুলি:

A STRING
a string

মনে রাখবেন এটি কেবল একটি সম্মেলন, তবে প্রচুর রুবি শ্রেণি এটি অনুসরণ করে। এটি আপনাকে আপনার কোডে কী পরিবর্তন করা হচ্ছে তা ট্র্যাক রাখতে সহায়তা করে।


2
প্রস্থান বনাম প্রস্থানের মতো মামলাও রয়েছে! এবং (রেলের মধ্যে) সেভ বনাম সেভ করুন!
অ্যান্ড্রু গ্রিম

24
খুব সাবধানতা অবলম্বন করুন - অনেক ছোট লাইব্রেরি এই কনভেনশনটি অনুসরণ করে না। যদি অদ্ভুত জিনিসগুলি ঘটে থাকে তবে প্রায়শই বস্তুর প্রতিস্থাপন করা হয়। সাথে আপত্তি = আপত্তি এটি ঠিক করে খুবই হতাশাজনক.
সারা মেই

101
ঠুং এছাড়াও পদ্ধতি একটি ব্যতিক্রম বাড়াতে জন্য ব্যবহার করা হয় যখন পদ্ধতি ছাড়া করে না, যেমন: saveএবং save!ActiveRecord
ecoologic

3
@ অভিলাষাককে বাঁচাও! এটি সংরক্ষণ করতে না পারলে একটি ত্রুটি উত্থাপন করে। এটি নিয়মিত সংরক্ষণ / মিথ্যা ফেরতের বিরোধী।
বুকঅফগ্রিগ

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

143

বিস্ময়কর বিন্দুটির অর্থ অনেকগুলি জিনিস এবং কখনও কখনও "এটি বিপজ্জনক, সাবধান থাকুন" ব্যতীত আপনি এ থেকে অনেক কিছুই বলতে পারবেন না।

অন্যরা যেমন বলেছে, স্ট্যান্ডার্ড পদ্ধতিতে এটি প্রায়শই এমন একটি পদ্ধতি নির্দেশ করতে ব্যবহৃত হয় যা কোনও অবজেক্টকে নিজের মধ্যে রূপান্তরিত করে, তবে সর্বদা তা নয়। নোট অনেক মান পদ্ধতি তাদের রিসিভার পরিবর্তন এবং কোন বিস্ময়বোধক বিন্দু (না pop, shift, clear), এবং বিস্ময়বোধক পয়েন্ট সঙ্গে কিছু পদ্ধতি তাদের রিসিভার পরিবর্তন করবেন না ( exit!)। উদাহরণস্বরূপ এই নিবন্ধটি দেখুন ।

অন্যান্য গ্রন্থাগারগুলি এটি আলাদাভাবে ব্যবহার করতে পারে। রেলগুলিতে একটি বিস্ময়বোধক পয়েন্টের অর্থ প্রায়ই থাকে যে পদ্ধতিটি নিঃশব্দে ব্যর্থ হওয়ার চেয়ে ব্যর্থতার উপরে ব্যতিক্রম ঘটায়।

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


75

এই নামকরণ কনভেনশনটি স্কিম থেকে তোলা হয়েছে ।

1.3.5 নামকরণ কনভেনশন

কনভেনশন দ্বারা, পদ্ধতিগুলির নাম যা সর্বদা বুলিয়ান মান দেয় return `? '' এ সাধারণত শেষ হয়। এই জাতীয় পদ্ধতিগুলিকে ভবিষ্যদ্বাণী বলা হয়।

কনভেনশন দ্বারা, প্রক্রিয়াগুলির নামগুলি যা পূর্বে বরাদ্দকৃত স্থানে (বিভাগে 3.4 দেখুন) মান সংরক্ষণ করে usually `! '' এ সাধারণত শেষ হয়। এই জাতীয় পদ্ধতিগুলিকে মিউটেশন পদ্ধতি বলে। কনভেনশন দ্বারা, কোনও মিউটেশন পদ্ধতির দ্বারা প্রত্যাবর্তিত মান নির্ধারিত।


2
এই উত্তরটির সাথে +1 এর সাথে একটি ডকুমেন্টেশন রয়েছে যা এর জন্য যুক্তিসঙ্গত ব্যাখ্যা দেয়! ব্যবহার সঞ্চয় করুন। সত্যিই ভাল উত্তর স্টিভেন
ডেভিডসিলভীরা

ধন্যবাদ @ ডেভিডসিলভীরা!
স্টিভেন হুইগ

24

! সাধারণত এর অর্থ হল যে পদ্ধতিটি ফলাফল ফেরানোর পরিবর্তে বস্তুর উপর কাজ করে। প্রোগ্রামিং রুবি বইটি থেকে :

যে পদ্ধতিগুলি "বিপজ্জনক", বা প্রাপককে সংশোধন করে, তার নাম "পেছন" দিয়ে দেওয়া যেতে পারে!


18

এটি একটি ব্যাং সহ পদ্ধতিগুলি বলা সবচেয়ে সঠিক! আরও বিপজ্জনক বা অবাক করা সংস্করণ। এমন অনেকগুলি পদ্ধতি রয়েছে যে একটি ব্যংকে ছাড়াই .destroyপরিবর্তিত হয় যেমন এবং সাধারণ পদ্ধতিগুলিতে কেবল এমন ব্যাঙ্গ থাকে যেখানে মূল লিবে একটি নিরাপদ বিকল্প বিদ্যমান।

উদাহরণস্বরূপ, অ্যারেতে আমাদের রয়েছে .compactএবং .compact!উভয় পদ্ধতি অ্যারেটিকে রূপান্তরিত করে তবে অ্যারেতে .compact!কোনও শূন্যপদ না থাকলে স্বের পরিবর্তে শূন্য ফেরত দেয় যা কেবল স্বদেশে ফিরে আসার চেয়ে অবাক করা।

শুধুমাত্র অ mutating পদ্ধতি আমি একটি ঠুং সঙ্গে পেয়েছি কোনদিন Kernelএর .exit!বেশি বিস্ময়কর .exitকারণ আপনার ধরতে না পারেন, SystemExitযখন প্রক্রিয়া বন্ধের করা হয়।

রেলস এবং অ্যাক্টিভেকর্ড এই প্রবণতাটি অব্যাহত রেখেছে যে এটি আরও 'বিস্ময়কর' প্রভাবগুলির জন্য ব্যাং ব্যবহার করে .create!যা ব্যর্থতায় ত্রুটি উত্থাপন করে।


16

থিসোমোরোহক্স ডটকম থেকে:

আমার ব্যক্তিগত পছন্দ অনুসারে একটি ঠাঁই নীচের উপায়ে ব্যবহার করা যেতে পারে।

1) একটি সক্রিয় রেকর্ড পদ্ধতি একটি ত্রুটি উত্থাপন করে যদি পদ্ধতিটি এটি যা বলে তাই করবে না।

2) একটি সক্রিয় রেকর্ড পদ্ধতি রেকর্ডটি সংরক্ষণ করে বা কোনও পদ্ধতি কোনও বস্তুকে সংরক্ষণ করে (যেমন স্ট্রিপ!)

৩) কোনও পদ্ধতি পোস্টের মতো কোথাও কোথাও "অতিরিক্ত" কিছু করে বা কিছু পদক্ষেপ করে।

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

ঠুং ঠুং শব্দ অন্যান্য বিকাশকারীদের দুটি সূত্র সরবরাহ করে।

1) পদ্ধতিটি কল করার পরে অবজেক্টটি সংরক্ষণ করা প্রয়োজন নয়।

2) আপনি যখন পদ্ধতিটি কল করবেন তখন ডিবি পরিবর্তন হতে চলেছে।

http://www.themomorohoax.com/2009/02/11/when-to-use-a-bang-exclamation-point-after-rails-methods


6

সহজ ব্যাখ্যা:

foo = "BEST DAY EVER" #assign a string to variable foo.

=> foo.downcase #call method downcase, this is without any exclamation.

"best day ever"  #returns the result in downcase, but no change in value of foo.

=> foo #call the variable foo now.

"BEST DAY EVER" #variable is unchanged.

=> foo.downcase! #call destructive version.

=> foo #call the variable foo now.

"best day ever" #variable has been mutated in place.

তবে আপনি যদি downcase!উপরের ব্যাখ্যায় কখনও কোনও পদ্ধতি কল করেন তবে fooস্থায়ীভাবে ডাউনচেসে পরিবর্তন হবে। downcase!কোনও নতুন স্ট্রিং অবজেক্ট ফেরত দেবে না তবে স্ট্রিংটি জায়গায় রেখে প্রতিস্থাপন করবে, সম্পূর্ণভাবে fooডাউনচেসে পরিবর্তন করে । আমি প্রস্তাব দিচ্ছি downcase!যে এটি সম্পূর্ণরূপে প্রয়োজনীয় না হলে আপনি ব্যবহার করবেন না ।


1
!

আমি এটিকে একটি বিস্ফোরক পরিবর্তন হিসাবে ভাবতে চাই যা এর আগে যা ঘটেছিল তা ধ্বংস করে দেয়। ব্যাং বা বিস্ময়কর চিহ্নটির অর্থ হল আপনি নিজের কোডে একটি স্থায়ী সংরক্ষিত পরিবর্তন করছেন making

যদি আপনি বিশ্বব্যাপী প্রতিস্থাপনের জন্য উদাহরণস্বরূপ রুবির পদ্ধতি ব্যবহার করেন gsub!তবে আপনার যে বিকল্পটি তৈরি হবে তা স্থায়ী।

আপনি এটি কল্পনা করতে পারেন এমন আরেকটি উপায়, একটি পাঠ্য ফাইল খোলার এবং সংরক্ষণ এবং অনুসন্ধানের পরে অনুসন্ধান এবং প্রতিস্থাপন করা। !আপনার কোড একই।

যদি আপনি বাশ জগত থেকে এসে থাকেন তবে আর একটি দরকারী অনুস্মারক sed -iস্থায়ীভাবে সংরক্ষিত পরিবর্তনটি করার একই প্রভাব রয়েছে।


1

"ধ্বংসাত্মক পদ্ধতি" নামে অভিহিত তারা আপনার উল্লেখ করা অবজেক্টের মূল অনুলিপি পরিবর্তন করার প্রবণতা রাখে।

numbers=[1,0,10,5,8]
numbers.collect{|n| puts n*2} # would multiply each number by two
numbers #returns the same original copy
numbers.collect!{|n| puts n*2} # would multiply each number by two and destructs the original copy from the array
numbers   # returns [nil,nil,nil,nil,nil]

0

নীচের লাইন: !পদ্ধতিগুলি কেবল যে বস্তুটির জন্য আহ্বান করা হয় তার মান পরিবর্তন করে, অন্যদিকে কোনও পদ্ধতি অবলম্বন না !করে কোনও কৌশল দ্বারা অবহিত না করে পদ্ধতিটি আহ্বান করা হয়েছিল।

!আপনি যদি ভেরিয়েবলটিতে সঞ্চিত মূল মানটির প্রয়োজনের পরিকল্পনা না করেন কেবল তখনই ব্যবহার করুন আপনি পদ্ধতিটি কল করেছেন।

আমি কিছু করতে পছন্দ করি:

foo = "word"
bar = foo.capitalize
puts bar

অথবা

foo = "word"
puts foo.capitalize

পরিবর্তে

foo = "word"
foo.capitalize!
puts foo

কেবলমাত্র আমি আবার মূল মানটি অ্যাক্সেস করতে চাই।


1
কারণ আপনার উত্তরটি কোনওভাবেই সহায়ক ছিল না। "নীচের লাইন:! পদ্ধতিগুলি কেবল যে বস্তুর প্রতি আহ্বান করা হয় তার মান পরিবর্তন করে" ঠিক সত্য নয়।
ডারউইন

@Darwin এটা করে বস্তুর মান পরিবর্তন করুন। !পরিবর্তিত অনুলিপি ফেরত না দিয়ে বস্তুকে রূপান্তরিত করে।
চার্লস

সুতরাং আপনি কি মনে করেন এটি কি করে? User.create!
ডারউইন

@ ডারউইন কোন প্রসঙ্গে? ActiveRecord?
চার্লস

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