কোনও ভেরিয়েবল সংজ্ঞায়িত করা হচ্ছে কিনা তা পরীক্ষা করছেন?


581

রুবিতে কোনও ভেরিয়েবল সংজ্ঞায়িত হয়েছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি? এখানে কিisset টাইপ পদ্ধতি উপলব্ধ আছে?

উত্তর:


791

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"

92
এটি যে ভেরিয়েবলটি সেট করা আছে nil তা লক্ষ করা উচিত।
স্কালে

7
যদি আপনি কোনও ভেরিয়েবল সেট করতে চান না যদি এটি উপস্থিত না থাকে এবং যদি তা থাকে তবে তা একা রেখে যান, নীচে @ ড্যানমেয়ারের উত্তর ( ||=অপারেটরকে জড়িত ) দেখুন।
jrdioko

2
এখানে আমি যা করতে পারি তার অন্য একটি বিজোড়তা এখানে .. আপনি যদি কোনও আইফ-ব্লকে একটি চলক নির্ধারণ করেন যার জন্য শর্তটি কখনই পূরণ হয় না, defined?তবুও সেই ব্লকের মধ্যে সংজ্ঞায়িত একটি পরিবর্তকের জন্য সত্য প্রত্যাবর্তন হয়!
elsurudo

1
defined?বুলিয়ান রিটার্ন করার মতো কোনও পদ্ধতি আছে কি ?
স্টিভেক

সত্য / মিথ্যা প্রত্যাবর্তনের জন্য!!defined?(object_name)
স্টিভেক

91

এটি বিদ্যমান যদি আপনি কিছু না করতে চান তবে এটি দরকারী যদি এটি উপস্থিত না থাকলে এটি তৈরি করুন।

def get_var
  @var ||= SomeClass.new()
end

এটি কেবল একবারে নতুন উদাহরণ তৈরি করে। এর পরে এটি কেবল ভেরটি ফেরত রাখে।


9
এটি খুব মূর্খ রুবিও এবং খুব সাধারণ, উপায় দ্বারা।
jrdioko

38
কেবল ||=বুলিয়ান মান সহ ব্যবহার করবেন না , পাছে আপনি বিভ্রান্তির বেদনা অনুভব করবেন না।
অ্যান্ড্রু মার্শাল

6
কি @AndrewMarshall বলেন পাশাপাশি কিছু আসতে পারে এই বাগ্ধারা এড়াতে nilপাশাপাশি যদি না আপনি সত্যিই অভিব্যক্তি প্রত্যেক সময় নির্ণয় করা এটা যখন এটি ফেরত না বলা চানnil
nzifnab

1
আপনি যদি বুলিয়ানদের সাথে কাজ করছেন এবং যদি ভেরিয়েবলটি সুস্পষ্টভাবে মিথ্যাতে না সেট করা হয় তবে ডিফল্ট মানটি সত্য হতে চান, আপনি এই নির্মাণটি ব্যবহার করতে পারেন: var = (var or var.nil?)
টনি জিটো

1
@ আরনাডমিউরেট বাছাই করুন, সত্যই নয়। - যদিও এটি অভিন্ন বলে মনে হচ্ছে না, তবে এই প্রশ্নের উত্তরগুলি পড়া ভাল।
তহবিল মনিকার লসুইট

70

উপরোক্ত বিবৃতিটির সঠিক বাক্য গঠন:

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আপনার পরিবর্তনশীল সহ ( ) প্রতিস্থাপন । এই বাক্য গঠনটি যদি বিবৃতিতে মূল্যায়নের জন্য সত্য / মিথ্যা মান প্রদান করে।


11
পরীক্ষায় ব্যবহৃত হওয়ার সময় শূন্যের মূল্যায়ন যেমন শিল হয় না
জেরোম

না কেন defined?(var) == nil?
ভোলআরন

@ ভোলআরন - এটি পুরোপুরি বৈধ সিনট্যাক্স। কল করার .nil?জন্য কলটি ব্যবহার করা আরও মূর্খবাদী they nilতুলনামূলক অপারেটর ব্যবহার করার চেয়ে কোনও বস্তুকে জিজ্ঞাসা করা আরও বেশি "অবজেক্ট-ওরিয়েন্টেড" । উভয়ই পড়তে অসুবিধা হয় না, তাই যে কোনও একটি ব্যবহার করুন আপনাকে আরও পণ্য সরবরাহ করতে সহায়তা করে।
juanpaco

আপনি কোন বক্তব্য রেফার করছেন?!? অন্য কোনও কিছুর মন্তব্য হিসাবে উত্তর ব্যবহার করবেন না।
আর্নাউদ মিউরেট

18

defined?(your_var)কাজ করবে. আপনি যা করছেন তার উপর নির্ভর করে আপনিও এর মতো কিছু করতে পারেনyour_var.nil?


+1 your_var.nil?কারণ এটি মিথ্যা সত্য বলে প্রত্যাবর্তন করে এবং পড়তে এবং লেখার চেয়ে অনেক ভাল defined? var। এর জন্য ধন্যবাদ.
কাকুবেই

28
your_var.nil?ত্রুটির পরিণতি হবে: undefined local variable or method your_varযখন এর আগে সংজ্ঞায়িত করা হয় না ...
গোবোল

16

"যদি" এর পরিবর্তে "যদি না" চেষ্টা করে দেখুন

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

এই উত্তরটি কী যুক্ত করে যা অন্য উত্তর দ্বারা বলা হয় নি?
অ্যান্ড্রু গ্রিম

2
এটি খুব সুন্দরভাবে আরও একটি কার্যকর উপায়ে প্রশ্নের উত্তর দেয়, তাই না?
বর্ণন

2
রুবি স্টাইল গাইডটি বলেছেন "নেতিবাচক অবস্থার জন্য যদি না হয় তবে ফেভারিট
ChrisPhoenix


8

এখানে কিছু কোড, রকেট বিজ্ঞানের কিছুই নেই তবে এটি যথেষ্ট ভাল কাজ করে

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

স্পষ্টতই, রঙিন কোডটি প্রয়োজনীয় নয়, এই খেলনা উদাহরণে কেবল একটি সুন্দর ভিজ্যুয়ালেশন।


সম্ভবত theচ্ছিক কারণ nil?
জেমস

8

সতর্কতা পুনরায়: একটি সাধারণ রুবি প্যাটার্ন

এটি মূল উত্তর: 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?পদ্ধতিটির সাহায্যে সেই লুকোচুরি হাঙ্গরকে এড়াতে পারেন ।


আপনি সম্পূর্ণরূপে ঠিক বলেছেন, সেই নির্দিষ্ট ক্যাভিয়েটটি হাইলাইট করার জন্য আপনাকে ধন্যবাদ
কুলগার

5

আপনি চেষ্টা করতে পারেন:

unless defined?(var)
  #ruby code goes here
end
=> true

কারণ এটি একটি বুলিয়ান ফেরত দেয়।


SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
অ্যান্ড্রু গ্রিম 23

একটি unlessবিবৃতি ব্যবহার করা অত্যধিক জটিল বলে মনে হচ্ছে
johannes

5

অন্য অনেক উদাহরণ যেমন দেখায় যে রুবিতে যৌক্তিক পছন্দ করতে আপনার কোনও পদ্ধতি থেকে বুলিয়ান দরকার নেই। আপনার বুলিয়ানটির প্রয়োজন না হলে এটি কোনও বুলিয়ানকে বাধ্য করার জন্য একটি দুর্বল রূপ হবে।

তবে আপনার যদি একেবারে বুলিয়ান দরকার হয়। ব্যবহার !! (ঠুং ঠুং শব্দ) বা "মিথ্যা মিথ্যা সত্য প্রকাশ করে"।

 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

3

এটি উল্লেখ করা উচিত যে 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')

2

"সংজ্ঞায়িত" এবং "নির্ধারিত" এর মধ্যে পার্থক্যটি নোট করুন।

$ 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, এবং যখন ভেরিয়েবলের একমাত্র অ্যাসাইনমেন্ট / উল্লেখটি একটি ইফ ব্লকে ছিল যে আঘাত হচ্ছিল না তখন বিভ্রান্ত হয়ে পড়েছিলাম ।
পল পেটেনগিল

0

এছাড়াও, আপনি পরীক্ষা করে দেখতে পারেন এটি সংবিধানের মাধ্যমে স্ট্রিংয়ের সময় সংজ্ঞায়িত হয়েছে কিনা, আপনি কোড দিলে:

puts "Is array1 defined and what type is it? #{defined?(@array1)}"

সংজ্ঞায়িত হলে সিস্টেমটি আপনাকে টাইপটি বলবে। যদি এটি সংজ্ঞায়িত না হয় তবে এটি ভেরিয়েবলটি আরম্ভ করা হয়নি বলে কেবল একটি সতর্কতা ফিরিয়ে দেবে।

আশাকরি এটা সাহায্য করবে! :)


0

defined?দুর্দান্ত, তবে আপনি যদি কোনও রেল পরিবেশে থাকেন তবে আপনি এটিও ব্যবহার করতে পারেন try, বিশেষত এমন ক্ষেত্রে যেখানে আপনি গতিশীল পরিবর্তনশীল নামটি পরীক্ষা করতে চান:

foo = 1
my_foo = "foo"
my_bar = "bar"
try(:foo)        # => 1
try(:bar)        # => nil
try(my_foo)      # => 1
try(my_bar)      # => nil
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.