রুবিতে কোনও ভেরিয়েবল সংজ্ঞায়িত হয়েছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি? এখানে কিisset
টাইপ পদ্ধতি উপলব্ধ আছে?
রুবিতে কোনও ভেরিয়েবল সংজ্ঞায়িত হয়েছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি? এখানে কিisset
টাইপ পদ্ধতি উপলব্ধ আছে?
উত্তর:
defined?
কীওয়ার্ডটি ব্যবহার করুন ( ডকুমেন্টেশন )। এটি আইটেমের ধরণের সাহায্যে একটি স্ট্রিং ফিরিয়ে দেবে, বা nil
এটি উপস্থিত না থাকলে।
>> a = 1
=> 1
>> defined? a
=> "local-variable"
>> defined? b
=> nil
>> defined? nil
=> "nil"
>> defined? String
=> "constant"
>> defined? 1
=> "expression"
স্কেলির মন্তব্য হিসাবে: "এটি যে পরিবর্তনশীল শূন্য করে সেট করা হয়েছে তা সূচনা করা উচিত বলে মনে করা উচিত" "
>> n = nil
>> defined? n
=> "local-variable"
||=
অপারেটরকে জড়িত ) দেখুন।
defined?
তবুও সেই ব্লকের মধ্যে সংজ্ঞায়িত একটি পরিবর্তকের জন্য সত্য প্রত্যাবর্তন হয়!
defined?
বুলিয়ান রিটার্ন করার মতো কোনও পদ্ধতি আছে কি ?
!!defined?(object_name)
এটি বিদ্যমান যদি আপনি কিছু না করতে চান তবে এটি দরকারী যদি এটি উপস্থিত না থাকলে এটি তৈরি করুন।
def get_var
@var ||= SomeClass.new()
end
এটি কেবল একবারে নতুন উদাহরণ তৈরি করে। এর পরে এটি কেবল ভেরটি ফেরত রাখে।
||=
বুলিয়ান মান সহ ব্যবহার করবেন না , পাছে আপনি বিভ্রান্তির বেদনা অনুভব করবেন না।
nil
পাশাপাশি যদি না আপনি সত্যিই অভিব্যক্তি প্রত্যেক সময় নির্ণয় করা এটা যখন এটি ফেরত না বলা চানnil
var = (var or var.nil?)
উপরোক্ত বিবৃতিটির সঠিক বাক্য গঠন:
if (defined?(var)).nil? # will now return true or false
print "var is not defined\n".color(:red)
else
print "var is defined\n".color(:green)
end
var
আপনার পরিবর্তনশীল সহ ( ) প্রতিস্থাপন । এই বাক্য গঠনটি যদি বিবৃতিতে মূল্যায়নের জন্য সত্য / মিথ্যা মান প্রদান করে।
defined?(var) == nil
?
.nil?
জন্য কলটি ব্যবহার করা আরও মূর্খবাদী they nil
তুলনামূলক অপারেটর ব্যবহার করার চেয়ে কোনও বস্তুকে জিজ্ঞাসা করা আরও বেশি "অবজেক্ট-ওরিয়েন্টেড" । উভয়ই পড়তে অসুবিধা হয় না, তাই যে কোনও একটি ব্যবহার করুন আপনাকে আরও পণ্য সরবরাহ করতে সহায়তা করে।
defined?(your_var)
কাজ করবে. আপনি যা করছেন তার উপর নির্ভর করে আপনিও এর মতো কিছু করতে পারেনyour_var.nil?
your_var.nil?
কারণ এটি মিথ্যা সত্য বলে প্রত্যাবর্তন করে এবং পড়তে এবং লেখার চেয়ে অনেক ভাল defined? var
। এর জন্য ধন্যবাদ.
your_var.nil?
ত্রুটির পরিণতি হবে: undefined local variable or method your_var
যখন এর আগে সংজ্ঞায়িত করা হয় না ...
"যদি" এর পরিবর্তে "যদি না" চেষ্টা করে দেখুন
a = "apple"
# Note that b is not declared
c = nil
unless defined? a
puts "a is not defined"
end
unless defined? b
puts "b is not defined"
end
unless defined? c
puts "c is not defined"
end
এখানে কিছু কোড, রকেট বিজ্ঞানের কিছুই নেই তবে এটি যথেষ্ট ভাল কাজ করে
require 'rubygems'
require 'rainbow'
if defined?(var).nil? # .nil? is optional but might make for clearer intent.
print "var is not defined\n".color(:red)
else
print "car is defined\n".color(:green)
end
স্পষ্টতই, রঙিন কোডটি প্রয়োজনীয় নয়, এই খেলনা উদাহরণে কেবল একটি সুন্দর ভিজ্যুয়ালেশন।
nil?
।
এটি মূল উত্তর: defined?
পদ্ধতি। উপরে গৃহীত উত্তর এটি পুরোপুরি চিত্রিত করে।
তবে aেউয়ের নীচে লুকিয়ে আছে এক হাঙ্গর ...
এই ধরণের সাধারণ রুবি প্যাটার্নটি বিবেচনা করুন:
def method1
@x ||= method2
end
def method2
nil
end
method2
সর্বদা ফিরে আসে nil
। আপনি যখন প্রথমবার কল করবেন method1
তখন @x
ভেরিয়েবল সেট করা নেই - তাই method2
চালানো হবে। এবং method2
সেট @x
করা হবে nil
। এটা ঠিক আছে, এবং সব ভাল এবং ভাল। কিন্তু দ্বিতীয়বার ফোন করলে কী হয় method1
?
মনে রাখবেন @x ইতিমধ্যে শূন্য করা হয়েছে। But method2
এখনও আবার চালানো হবে !! মেথড 2 যদি ব্যয়বহুল উদ্যোগ নেওয়া হয় তবে এটি আপনি চান এমন কিছু নাও হতে পারে।
defined?
পদ্ধতিটি উদ্ধারে আসা যাক - এই সমাধানের সাহায্যে সেই বিশেষ কেসটি পরিচালনা করা হয় - নিম্নলিখিতটি ব্যবহার করুন:
def method1
return @x if defined? @x
@x = method2
end
শয়তানটি বিশদে রয়েছে: তবে আপনি defined?
পদ্ধতিটির সাহায্যে সেই লুকোচুরি হাঙ্গরকে এড়াতে পারেন ।
আপনি চেষ্টা করতে পারেন:
unless defined?(var)
#ruby code goes here
end
=> true
কারণ এটি একটি বুলিয়ান ফেরত দেয়।
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
বিবৃতি ব্যবহার করা অত্যধিক জটিল বলে মনে হচ্ছে
অন্য অনেক উদাহরণ যেমন দেখায় যে রুবিতে যৌক্তিক পছন্দ করতে আপনার কোনও পদ্ধতি থেকে বুলিয়ান দরকার নেই। আপনার বুলিয়ানটির প্রয়োজন না হলে এটি কোনও বুলিয়ানকে বাধ্য করার জন্য একটি দুর্বল রূপ হবে।
তবে আপনার যদি একেবারে বুলিয়ান দরকার হয়। ব্যবহার !! (ঠুং ঠুং শব্দ) বা "মিথ্যা মিথ্যা সত্য প্রকাশ করে"।
› irb
>> a = nil
=> nil
>> defined?(a)
=> "local-variable"
>> defined?(b)
=> nil
>> !!defined?(a)
=> true
>> !!defined?(b)
=> false
কেন এটি বাধ্য করার জন্য সাধারণত অর্থ প্রদান করে না:
>> (!!defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red)) == (defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red))
=> true
এখানে এটি উদাহরণ রয়েছে যেখানে এটি গুরুত্বপূর্ণ কারণ এটি তার স্ট্রিং প্রতিনিধিত্বের বুলিয়ান মানের অন্তর্নিহিত জবরদস্তির উপর নির্ভর করে।
>> puts "var is defined? #{!!defined?(a)} vs #{defined?(a)}"
var is defined? true vs local-variable
=> nil
এটি উল্লেখ করা উচিত যে defined
একটি হ্যাশে একটি নির্দিষ্ট ক্ষেত্র সেট করা আছে কিনা তা পরীক্ষা করে ব্যবহার করা অপ্রত্যাশিত আচরণ করতে পারে:
var = {}
if defined? var['unknown']
puts 'this is unexpected'
end
# will output "this is unexpected"
বাক্য গঠন এখানে সঠিক, তবে defined? var['unknown']
স্ট্রিংয়ের সাথে মূল্যায়ন করা হবে "method"
, সুতরাং if
ব্লকটি কার্যকর করা হবে
সম্পাদনা: কোনও হ্যাশটিতে কী উপস্থিত রয়েছে কিনা তা যাচাইয়ের জন্য সঠিক স্বরলিপিটি হ'ল:
if var.key?('unknown')
"সংজ্ঞায়িত" এবং "নির্ধারিত" এর মধ্যে পার্থক্যটি নোট করুন।
$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"
x নির্ধারিত হলেও এটি কখনই নির্ধারিত হয় না!
NameError Exception: undefined local variable or method
, এবং যখন ভেরিয়েবলের একমাত্র অ্যাসাইনমেন্ট / উল্লেখটি একটি ইফ ব্লকে ছিল যে আঘাত হচ্ছিল না তখন বিভ্রান্ত হয়ে পড়েছিলাম ।
এছাড়াও, আপনি পরীক্ষা করে দেখতে পারেন এটি সংবিধানের মাধ্যমে স্ট্রিংয়ের সময় সংজ্ঞায়িত হয়েছে কিনা, আপনি কোড দিলে:
puts "Is array1 defined and what type is it? #{defined?(@array1)}"
সংজ্ঞায়িত হলে সিস্টেমটি আপনাকে টাইপটি বলবে। যদি এটি সংজ্ঞায়িত না হয় তবে এটি ভেরিয়েবলটি আরম্ভ করা হয়নি বলে কেবল একটি সতর্কতা ফিরিয়ে দেবে।
আশাকরি এটা সাহায্য করবে! :)
nil
তা লক্ষ করা উচিত।