একটি উদাহরণ ভেরিয়েবলের নাম অনুসারে এর মান পান


99

সাধারণভাবে, আমি কীভাবে কোনও জিনিসের রেফারেন্স পেতে পারি যার নামটিতে স্ট্রিং রয়েছে?

আরও সুনির্দিষ্টভাবে বলতে গেলে, আমার কাছে প্যারামিটার নামের একটি তালিকা রয়েছে (সদস্য ভেরিয়েবলগুলি - গতিশীলভাবে নির্মিত তাই আমি তাদের সরাসরি উল্লেখ করতে পারি না)।

প্রতিটি প্যারামিটার এমন একটি অবজেক্ট যার একটি from_sপদ্ধতিও রয়েছে।

আমি নিম্নলিখিতগুলির মতো কিছু করতে চাই (যা অবশ্যই কাজ করে না ...):

define_method(:from_s) do | arg |
    @ordered_parameter_names.each do | param |
        instance_eval "field_ref = @#{param}"
        field_ref.from_s(param)
    end
end

উত্তর:


179

এটি অর্জনের সবচেয়ে অলঙ্কৃত উপায় হ'ল:

some_object.instance_variable_get("@#{name}")

ব্যবহার করার দরকার নেই +বা intern; রুবি এই ঠিকঠাক পরিচালনা করবে। তবে, আপনি যদি নিজেকে অন্য কোনও জিনিসে পৌঁছানোর এবং এর আইভারটি বের করে দেখতে পান, তবে আপনার এনক্যাপসুলেশন ভেঙে যাওয়ার যথেষ্ট সম্ভাবনা রয়েছে।

আপনি যদি স্পষ্টভাবে একটি আইভার অ্যাক্সেস করতে চান তবে সঠিক কাজটি হ'ল এটি একটি অ্যাক্সেসর তৈরি করা। নিম্নোক্ত বিবেচনা কর:

class Computer
  def new(cpus)
    @cpus = cpus
  end
end

এই ক্ষেত্রে, আপনি যদি তা করেন তবে আপনাকে Computer.newএটিকে instance_variable_getপেতে বাধ্য হতে হবে @cpus। তবে আপনি যদি এটি করছেন তবে আপনার সম্ভবত @cpusজনসাধারণের কাছে বোঝানো উচিত। আপনার যা করা উচিত তা হ'ল:

class Computer
  attr_reader :cpus
end

এখন আপনি করতে পারেন Computer.new(4).cpus

মনে রাখবেন যে আপনি যে কোনও বিদ্যমান শ্রেণিটি আবার খুলতে পারেন এবং একটি প্রাইভেট আইভারকে পাঠক হিসাবে তৈরি করতে পারেন। যেহেতু একজন অ্যাক্সেসর কেবল একটি পদ্ধতি, আপনি এটি করতে পারেনComputer.new(4).send(var_that_evaluates_to_cpus)


দৃষ্টান্ত_ভরিয়াবল_জেট ("@ # {নাম}") ভেরিয়েবলের মান ফেরত দেয় না? আমার আসল বস্তুর একটি রেফারেন্স দরকার। আমি পুনরায় লেখার কাজটি শেষ করেছিলাম যার চেয়ে অনেকগুলি ভেরিয়েবল + আমার যে ক্রমটি চেয়েছিল তার নামের সাথে একটি অ্যারে রাখার পরিবর্তে আমি প্যারামিটারগুলি নিজেকে অ্যারেতে রেখেছি (নকশার সিদ্ধান্তটি ছিল অ্যারেটি অনুসন্ধানের মাধ্যমে প্রতিবার ভেরিয়েবল অ্যাক্সেস করা উচিত বা না করে অনুকূলিত করা) তাদের নামের সাথে অতিরিক্ত অ্যারে যা কেবলমাত্র যখন প্রয়োজন হবে তখন ব্যবহার করা হবে)
LK__

নোপ: দৃষ্টান্ত_ভেদযোগ্য_জেট ("@ # {নাম}") আসল বস্তুটি ফেরত দেয়।
ইয়াহুদা কাটজ

একটু স্পষ্টতার জন্য মৃত থ্রেডটি উন্মোচন করা হচ্ছে। সম্পূর্ণ উদাহরণটি হ'ল: ক্লাস কম্পিউটার অ্যাটর_প্রাণ: সিপাস ডিএফ নতুন (সিপাস) @ সিপাস = সিপাস শেষ?
নিকোলাস ডি ফন্টেনে

"তবে, আপনি যদি নিজেকে অন্য কোনও জিনিসে পৌঁছানোর এবং এর আইভারটি বের করতে দেখেন, তবে আপনার এনক্যাপসুলেশন ভেঙে যাওয়ার যথেষ্ট সম্ভাবনা রয়েছে" " আমরা কীভাবে অন্য একটি বস্তুর আইভারে প্রবেশ করব?
রুবিমিনার

9

একটি উদাহরণ ভেরিয়েবলের নাম থেকে একটি উদাহরণ ভেরিয়েবল পেতে:

name = "paramName"
instance_variable_get(("@" + name).intern)

এটি ইনস্ট্যান্স ভেরিয়েবলের মান প্রদান করবে @paramName


গতিশীলভাবে একটি বর্গ তৈরি করার সময়, আমার কাছে উদাহরণের পরিবর্তনশীল নামগুলির একটি অ্যারে রয়েছে (আমার এই তালিকাটি প্রয়োজন কারণ আমি তাদের একটি নির্দিষ্ট ক্রমে পরিচালনা করতে পারি)। এই নামটি ব্যবহার করে, আমি চলকটির একটি রেফারেন্স পেতে চাই।
এল কে__

4
আমার একটি স্ট্রিং "প্যারামনেম" আছে এবং @
স্প্যানিশ

4
ঠিক আছে. আমি আপনাকে পরামর্শ দিচ্ছি যে আপনার প্রশ্নটি সম্পাদনা করুন ঠিক সেই দুটি মন্তব্য বলতে।
ড্যানিয়েল লুক্রাফট

4
এছাড়াও, এটি deserialization সঙ্গে কিছুই করার ছিল না। আরও ভাল শিরোনাম হতে পারে "এর উদাহরণ অনুসারে একটি পরিবর্তনশীলের মান পান" বা অন্য কিছু value
ড্যানিয়েল লুক্রাফট

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