দৃষ্টান্ত পরিবর্তনশীল: স্ব বনাম @


179

এখানে কিছু কোড রয়েছে:

class Person
  def initialize(age)
    @age = age
  end

  def age
    @age
  end

  def age_difference_with(other_person)
    (self.age - other_person.age).abs
  end

  protected :age
end

কি আমি জানতে চাই ব্যবহার মধ্যে পার্থক্য @ageএবং self.ageage_difference_withপদ্ধতি।

উত্তর:


260

লেখা @age সরাসরি উদাহরণের পরিবর্তনশীল অ্যাক্সেস করে @age। লিখনটি self.ageনিজেকে বার্তা প্রেরণে অবজেক্টকে বলে age, যা সাধারণত উদাহরণটি পরিবর্তনশীল ফিরিয়ে দেয় @age- তবে ageপ্রদত্ত সাবক্লাসে পদ্ধতিটি কীভাবে প্রয়োগ করা হয় তার উপর নির্ভর করে অন্যান্য অনেকগুলি কাজ করতে পারে । উদাহরণস্বরূপ, আপনার কাছে একটি মিডলএজডসোসালাইট ক্লাস থাকতে পারে যা সর্বদা তার বয়সটিকে তার চেয়ে 10 বছর কম বয়সে প্রতিবেদন করে। বা আরও ব্যবহারিকভাবে, একটি পার্সিস্ট্যান্ট পার্সন ক্লাস অবিরাম স্টোর থেকে অলসভাবে সেই ডেটাটি পড়তে পারে, তার সমস্ত অবিরাম ডেটা একটি হ্যাশে ক্যাশে করে।


2
আমি একবার রেলপথে একটি বই পড়েছি এবং এই স্ব এবং @ এর মধ্যে পার্থক্য বুঝতে পারি না, তাই সর্বদা আমার পাবলিক ইন্টারফেস ব্যবহার করে আমার ডেটা তৈরি করতে আমার পদ্ধতিগুলিতে (যেটি সেটেটর এবং গেটর হয় না) সেল্ফ.ওয়ার_নাম ব্যবহার করা উচিত, আমি গেটর এবং সেটারে এটি সংজ্ঞায়িত করতে ব্যয় করেছেন, তাই না?
সরুনউ

1
... ইংরাজী ... যে কোনও সংখ্যক জিনিস দ্বারা আপনি কী বোঝাতে চাইছেন? আমি দেওয়া শেষ দুটি উদাহরণ পেলাম না।
ব্যবহারকারী 2167582

23

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


15
ওহহ, কেননা স্বয়জেজ একটি উদাহরণ ভেরিয়েবল বা একটি উদাহরণ পদ্ধতিতে উল্লেখ করতে পারে?
নোলান অ্যামি

@। @ ... দুঃখজনক
ঘটনাটি

7

সতর্কতা অবলম্বন করুন যখন আপনি এমন কোনও শ্রেণীর উত্তরাধিকারী হন Struct.newযা থেকে ইনটালাইজার তৈরি করার ঝরঝরে উপায় (রুবিতে কীভাবে প্রারম্ভক সরঞ্জাম তৈরি করবেন? )

class Node < Struct.new(:value)
    def initialize(value)
        @value = value
    end
    def show()
        p @value
        p self.value # or `p value`
    end
end 

n = Node.new(30)
n.show()

ফিরে আসবে

30
nil

তবে আপনি যখন আরম্ভকারীটি সরিয়ে ফেলবেন তখন তা ফিরে আসবে

nil
30

ক্লাস সংজ্ঞা সহ

class Node2
    attr_accessor :value
    def initialize(value)
        @value = value
    end
    def show()
        p @value
        p self.value
    end
end

আপনার কনস্ট্রাক্টর সরবরাহ করা উচিত।

n2 = Node2.new(30)
n2.show()

ফিরে আসবে

30
30

@ প্রসেসিক উদাহরণের জন্য ধন্যবাদ, আমি বর্তমানে রুবেলগুলিকে রেলস শিখছি এবং হুবহু এমনই আচরণ যা আমাকে অনুভব করে যে রুবি অহেতুক জটিল <
সাইক 115

3

প্রথম উত্তরটি পুরোপুরি সঠিক, তবে আপেক্ষিক নবাগত হিসাবে এটি আমার দ্বারা কী বোঝানো হয়েছিল তা তাত্ক্ষণিকভাবে আমার কাছে পরিষ্কার হয়ে যায়নি (স্ব-বার্তাগুলি প্রেরণ করছেন? আহহহ ...)। আমি মনে করি যে একটি সংক্ষিপ্ত উদাহরণ সাহায্য করবে:

class CrazyAccessors
  def bar=(val)
    @bar = val - 20 # sets @bar to (input - 20)
  end
  def bar
    @bar
  end

  def baz=(value)
    self.bar = value # goes through `bar=` method, so @bar = (50 - 20)
  end

  def quux=(value)
    @bar = value     # sets @bar directly to 50
  end
end

obj  = CrazyAccessors.new
obj.baz = 50
obj.bar  # => 30
obj.quux = 50
obj.bar  # => 50

8
এই উদাহরণটি জিনিসগুলিকে আরও বিভ্রান্ত করেছে।
ওসকার হলমক্র্যাটজ

1
আমি দুঃখিত তবে উদাহরণটি আমার পক্ষে যথেষ্ট মন্তব্য করা হয়নি। আমি আপনার যুক্তি অনুসরণ করতে পারি না।
Kouty

যে কেউ স্মলটাক থেকে এসেছিল সে বলবে যে কোনও বস্তু "নিজের কাছে একটি বার্তা প্রেরণ করে।" পাইথন থেকে আগত কেউ বলবে যে কোনও বস্তু "নিজেই একটি পদ্ধতি কল করে।" বিভ্রান্ত হবেন না; তারা ঠিক একই জিনিস। (কোনও শব্দার্থবিজ্ঞানবাদী আপত্তি জানাতে পারেন যে তারা গতিশীল টাইপিংয়ের সাথে ভাষার ক্ষেত্রে কেবল একই এবং সি ++ ভার্চুয়াল পদ্ধতি কলটি কোনও বার্তা প্রেরণের মতো নয় pur শুদ্ধবাদী সঠিক, তবে এটি সম্ভবত এই প্রশ্নের / ক্ষেত্রের বাইরে) / উত্তর।)
গ্র্যান্ডঅপেনার

আমি উদাহরণটি পছন্দ করি তবে দয়া করে আসলে কী ঘটছে সে সম্পর্কে আরও কিছু মন্তব্য সরবরাহ করুন। কোনও ব্যাখ্যা ছাড়াই অনুসরণ করা কঠিন
CalamityAdam

2

কোন পার্থক্য নেই। আমার সন্দেহ হয় যে এটি কেবল একে অপরকে দেখার self.ageother_person.ageকাছাকাছি করার ডকুমেন্টারি মানের জন্য করা হয়েছিল ।

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

তবে এটি নিয়ে উদ্বেগের এক অসম্ভব বিমূর্ততা, সর্বোপরি, যদি অবজেক্টের প্রয়োগটি পরিবর্তিত হয় তবে অন্য পদ্ধতিগুলি পরিবর্তন করা যুক্তিসঙ্গত, কোনও এককালে অবজেক্টের মধ্যে একটি সাধারণ রেফারেন্স পুরোপুরি যুক্তিসঙ্গত।

যে কোনও ক্ষেত্রে, ageসম্পত্তির বিমূর্ততা এখনও স্পষ্টভাবে এর ব্যাখ্যার ব্যাখ্যা দেয় না self, যেমন সহজ সরল ageএছাড়াও অ্যাক্সেসরকে অনুরোধ করেছিল।


-3

@age - অবশ্যই উদাহরণ পরিবর্তনশীল বয়স

self.age - উদাহরণ সম্পত্তি বয়স বোঝায়।

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