একটি অবজেক্ট তৈরি করুন যার কার্যভারের স্থিতি পরিবর্তিত হয়


31

আমি এটি গভীরভাবে অদ্ভুত বলে মনে করি যে এটি রুবিতে সম্ভব (আমি তাৎক্ষণিকভাবে কীভাবে বলব না):

obj = #code redacted

print obj.state # Some value.

LValue = obj

print obj.state # Different value!

আপনার চ্যালেঞ্জটি এই ফর্মের মোটামুটি কোড তৈরি করা। একটি অবজেক্ট তৈরি করুন এবং এটি একটি ভেরিয়েবলকে বরাদ্দ করুন। এটির মতো stateউপরের মতো কিছু সংজ্ঞায়িত বৈশিষ্ট্য (বা ডিটারমিনিস্টিক, আইডেম্পোটেন্ট পদ্ধতি) থাকা উচিত , যা বস্তুটি নতুন সনাক্তকারীকে ( LValueউপরে) নির্ধারিত হওয়ার পরে পরিবর্তিত হয় , এমনকি যদি আপনি এখনও এটি চিহ্নিত করতে পুরানো শনাক্তকারী ( objউপরে) ব্যবহার করেন ।

জোরের জন্য সম্পাদনা করুন : stateবা সমতুল্যটি আদর্শবান হতে হবে, সুতরাং মানটি সংশোধনকারী এমন একটি অ্যাকসেসর তৈরি করা বা অন্য কোনও কারণে পরপর বেশ কয়েকবার ডেকে ডেকে বিভিন্ন ফলাফল প্রদান করা বৈধ সমাধান নয়। অথবা, আরও সহজভাবে বললে, এ্যাসাইনটি হতে হবে যা রাষ্ট্রকে পরিবর্তন করে।

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


আবশ্যক LValue = objলাইন জন্য প্রয়োজন হতে stateআসলে পরিবর্তন? (আমি কেবলমাত্র সি # তে একটি সম্পত্তি তৈরি করতে পারলাম যা আপনি যতবার পাবেন প্রতিবার
টিম এস

2
হ্যাঁ, এই পদ্ধতিটি আদর্শবান্ধব হওয়ার প্রয়োজনটি বলার দ্বারা আমি লক্ষ্য করেছি। আমি আরও পরিষ্কার করতে সম্পাদনা করব।
হিস্টোক্র্যাট

ঠিক আছে ধন্যবাদ. আমি অবশ্যই এই অংশটি দেখেছি
টিম এস

4
সহজেই কি অবজেক্টের কাজের গণনা ফিরিয়ে দেবে?
নিক টি

বস্তু নিজেই ধ্বংসাত্মক পরিবর্তন হবে? EmacsLisp: (setq a (list "val")) (setq b (nconc a "val2"))উদাহরণস্বরূপ। যে বিন্দু aহিসাবে মূল্যায়ন শেষ ("val" . "val2")
জোনাথন লিচ-পেপিন

উত্তর:


30

সি ++

এটি সঠিক সরঞ্জামগুলি ব্যবহার করে তুচ্ছ।

#include <iostream>

using namespace std;

class Obj {
public:
   int state;

   Obj& operator= (Obj& foo) {
      foo.state++;
      this->state = foo.state - 2;
      return *this;
   }
};

int main() {
   Obj a, b, c, d;
   a.state = 3;
   b.state = 4;

   cout << a.state << " " << b.state << "\n";

   c = a;
   d = b;

   cout << a.state << " " << b.state << " " << c.state << " " << d.state << "\n";

   return 0;
}

আউটপুট:

3 4
4 5 2 3

12
যে মুহুর্তে আমি শিরোনামটি দেখেছি, আমি জানতাম যে কেউ অপারেটর ওভারলোডিং করবে। এটা সুস্পষ্ট উপায়। একটি upvote আছে।

17

পিএইচপি (ডিবাগ বিল্ড,> = 5.4)

আমরা একটি গেটরে অবজেক্টের রিফকাউন্ট ব্যবহার করি। (সুতরাং, অ্যাসাইনমেন্টের মাধ্যমে, পুনরায় গণনা বৃদ্ধি এবং মান পরিবর্তন হয়)

class State {
    public function __get($arg) {
        ob_start();
        debug_zval_dump($this); // e.g. "object(State)#1 (0) refcount(6)"
        return ob_get_clean()[29];
    }
}

$obj = new State;
var_dump($obj->state);
$a = $obj;
var_dump($obj->state);

14

সি শার্প

দুটি সহজ বিকল্প:

class Obj
{
    public int state;
    public static implicit operator int(Obj o)
    {
        return o.state++;
    }
}

static int LValueI;
static Obj LValueM { set { value.state++; } }
static void Main()
{
    var obj = new Obj { state = 1 };
    LValueI = obj;
    Console.WriteLine(obj.state); //2, caused by the implicit cast.

    LValueM = obj;
    Console.WriteLine(obj.state); //3, caused by the property setter.
    Console.ReadLine();
}

অথবা আমরা কেবল একই স্মৃতিতে লিখতে পারি:

[StructLayoutAttribute(LayoutKind.Explicit)]
class Program
{
    [FieldOffset(0)]
    int state = 1;
    [FieldOffset(1)]
    int LValue;

    void Test()
    {
        var obj = this;

        Console.WriteLine(state);  //1
        LValue = state;
        Console.WriteLine(state);  //257
        Console.ReadLine();
    }
    static void Main() { new Program().Test(); }
}

12

টেক্স, অন্যান্য উত্তরগুলির তুলনায় এখানে আরও খাটো

\setbox0=\hbox{Hello world!} % Put stuff in the box 0.
\message{\the\wd0}           % Print the width of the box => non-zero
\setbox2=\box0               % Put the box instead in box 2.
\message{\the\wd0}           % Now box 0 is void, hence has zero width.

টাইপসেটিং সিস্টেম হিসাবে, টেক্সের একটি "বাক্স" টাইপ রয়েছে, এতে টাইপসেট উপাদান রয়েছে। যেহেতু সর্বাধিক প্রচলিত ব্যবহারের ক্ষেত্রটি হ'ল এই উপাদানটিকে চারদিকে স্থানান্তরিত করা, এটিকে ভাগ করা ইত্যাদি, এর অনুলিপি তৈরির পরিবর্তে বাক্সগুলি সাধারণত ব্যবহার করা হলে মুছে ফেলা হয় (বা বরং, "বাক্স" ভেরিয়েবলগুলি পয়েন্টার হয় এবং একসাথে কেবলমাত্র একটি পয়েন্টার পয়েন্ট করতে পারে স্মৃতিতে একটি আসল বাক্সে)। কোনও যাদু করার দরকার নেই।


8

সি ++ ১১ (সুতরাং আপনি ছেলেরা অনন্য_প্রেটার / শেয়ার্ড_পিটার :-) সম্পর্কে ভুলে গেছেন)

#include <iostream>
#include <memory>
using namespace std;
int main() {
    std::unique_ptr<int> u1(new int(0)), u2;
    std::shared_ptr<int> s1 = std::make_shared<int>(0), s2;
    std::cout<<u1.get()<<" "<<u2.get()<<" "<<std::endl;
    std::cout<<s1.use_count()<<" "<<s2.use_count()<<" "<<std::endl;
    u2 = std::move(u1);
    s2 = s1;
    std::cout<<u1.get()<<" "<<u2.get()<<" "<<std::endl;
    std::cout<<s1.use_count()<<" "<<s2.use_count()<<" "<<std::endl;
   return 0;
}

7

ফরট্রান 03

এটি হুগোর ডি উত্তরটির সাথে কিছুটা মিল, তবে এটি আরও কিছুটা লুকিয়ে রয়েছে (আংশিক কারণ কে # $% Ob অবজেক্ট ওরিয়েন্টেড ফরট্রানকে জানেন)?

module objects
   implicit none

   type ObjDef
      integer :: state
    contains
      procedure :: initObject
      procedure :: printObject
      procedure :: setNew
   end type
 contains
   subroutine initObject(this)
     class(ObjDef) :: this
     this%state = this%state + 1
   end subroutine initObject

   subroutine printObject(this)
     class(ObjDef) :: this
     print '(a,i0)',"this%state = ",this%state
   end subroutine printObject

   subroutine setNew(this,that)
     class(ObjDef) :: this,that
     that%state = this%state
   end subroutine setNew

end module objects

program objectChange
   use objects
   type(ObjDef) :: a,b

   call initObject(a)
   call printObject(a)
   call b%setNew(a)
   call printObject(a)
end program objectChange

আউটপুট হয়

this%state = 1
this%state = 0

আপনি যদি বুঝতে পারেন যে কী ঘটেছিল, বোনাস আপনাকে নির্দেশ করে! যদি না:

setNewফর্মটিতে পদ্ধতিটি কল করার সময় call b%setNew(a), bস্পষ্টভাবে প্রথম যুক্তিটি হয়, দ্বিতীয়টি নয়।


7

শক্তির উৎস

এটি এমন একটি বস্তু তৈরি করে যার stateসম্পত্তিটি সেই ভেরিয়েবলের নাম যা বস্তুটির দিকে নির্দেশ করে।

$a = @{}| Add-Member -MemberType:16 -PassThru state -Value {
        (gv|?{$this -eq $_.Value}|%{$_.Name}) -join ','} 

'Before: ' + $a.state
$b = $a
'After: ' + $a.state

আউটপুট

Before: a,this
After: a,b,this

দ্রষ্টব্য: যদি কোনও শিশু স্কুলে অ্যাসাইনমেন্টটি ঘটে তবে এটি কাজ করে না।

'Before: ' + $a.state
&{$b = $a}
'After: ' + $a.state

আউটপুট

Before: a,this
After: a,this

গেট-ভেরিয়েবল স্মার্ট!
mazzy

5

পার্ল 5

পার্লে এটি করার একটি উপায় এখানে:

package Magic {
    sub new { bless {state => 1} }
    use overload '""' => sub { $_[0]{state}++ };
}
use feature 'say';

my $obj = new Magic;
say $obj->{state};
substr($_, 0) = $obj;
say $obj->{state};

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

1
2

ব্যাখ্যা:

এটি ওভারলোডিংয়ের একটি সহজ অ্যাপ্লিকেশন । বিশেষত, আমি স্ট্রিং রূপান্তরকারী অপারেটরটিকে ওভারলোড করি "", যা ওভারলোড হওয়া অবজেক্টকে বরাদ্দ করা হলে ডাকা হয়substr() (যা হ্যাঁ, পার্লের একটি আইনী অবদান) কল হয়।

পারলে প্রচুর পরিমাণে বিশেষ ভেরিয়েবল রয়েছে যা তাদের নির্ধারিত যে কোনও কিছুকেই শক্তিশালী করে। উদাহরণস্বরূপ, নিম্নলিখিতগুলিও কাজ করে:

my $obj = new Magic;
say $obj->{state};
$0 = $obj;
say $obj->{state};

বিকল্প সমাধান

এটির আরও একটি উপায়:

package Magic {
    use Devel::Peek 'SvREFCNT';
    sub new { bless \my $foo }
    sub state { SvREFCNT ${$_[0]} }
}
use feature 'say';

my $obj = new Magic;
say $obj->state;
my $other = $obj;
say $obj->state;

এখানে, stateএকটি পদ্ধতি (আমরা এটি আরও টাই / ওভারলোড শেননিগানগুলির সাথে একটি বৈশিষ্ট্য তৈরি করতে পারতাম, তবে এটি জিনিসগুলিকে জটিল করে তুলবে) যা আক্ষরিক অর্থে অবজেক্টের উল্লেখগুলির সংখ্যা গণনা করে। সুতরাং, প্রথম সমাধানের বিপরীতে, আপনাকে আসলে $objএকটি সাধারণ ভেরিয়েবলের দায়িত্ব দিতে হবে যা রাষ্ট্র পরিবর্তন করতে কোনও অবজেক্ট রেফারেন্স ধরে রাখতে পারে।


5

জাভাস্ক্রিপ্ট

ঠিক আছে, তাই আমি একটি সংক্ষিপ্ত সংস্করণ তৈরি করেছি যা এসএসসিসিই হিসাবে কাজ করে, তবে জাভাস্ক্রিপ্টটি সঠিকভাবে বিশ্লেষণ করার চেষ্টা করে না, তাই আরও জটিল স্ক্রিপ্টের ভিতরে রাখলে রেফারেন্স গণনা কাজ নাও করতে পারে।

(function run () {
    var lineOne = getLine (1), a, b, x, y, z;
    var x = {
        get state () {
            var x=/([a-z]+)\s*=\s*([a-z]+)/,c;
            return 1 + Object.keys (c = run.toString ().split ('\n').slice (0,getLine (2)).filter (function (a) {return (x.test (a))}).reduce (function (a,b,c,d) {var r=b.match (x),t=r[2];while (a[t]){t=a[t]};a[r[1]]=t;return a}, {v:0})).reduce (function (a,b) {return (c[b]=="x"?1:0) + a},0)
        }
    };
    console.log (x.state);  //1
    console.log (x.state);  //1
    y = x;
    console.log (x.state);  //2
    z = y;
    console.log (x.state);  //3    
    a = z;
    b = a;
    console.log (x.state);  //5
    a = null;
    console.log (x.state);  //4
    b = null;
    console.log (x.state);  //3
})() //1 1 2 3 5 4 3 

function getLine(n) {
   try {
      to
   } catch (dat) {
      var stack = dat.stack.split('\n');
       for (var i = 0; i < stack.length; i++) {
           if (~stack[i].indexOf ('getLine')) break;          
       }
      return dat.stack.split ('\n')[i + ~~n].match (/:(\d+)/)[1] - ~~window.hasOwnProperty ('__commandLineAPI')
   }
}

2
আপনি কি করছেন তা বোঝানোর জন্য যত্নশীল?
রায়ান

5
... এই বিশ্বের কি? ও_ও
ডোরকনবব

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

1
সবচেয়ে দীর্ঘ ... এবং প্রশস্ত!
নিকোলাস বারবুলেসকো


4

পাইথন

এটি কিছুটা প্রতারণা করছে তবে কীভাবে:

import gc
class A(object):
    @property
    def state(self):
        return len(gc.get_referrers(self))

a = A()
print a.state
b = {"x": a}
print a.state
a.y = a
print a.state
del a
print b["x"].state

4

সি ++ 11

যদিও এটি অন্যান্য ভাষাগুলির জন্য বাড়ানো যেতে পারে যা অন্তর্নিহিত / স্পষ্টভাবে ধ্বংসকারীদের সমর্থন করে

#include <iostream>
using namespace std;

class Foo {
    int *ptr;
public:
    Foo() {
        ptr = new int(0);
    }   
    int state() {
        return *ptr;
    }
    ~Foo() {
        (*ptr)++;
    }
};
int main() {
    Foo a, b;
    cout << a.state() << " " << b.state() << "\n";
    {
        Foo c, d;
        c = a;
        d = b;
    }
   cout << a.state() << " " << b.state()  << "\n";

   return 0;
}

ডিফল্ট অ্যাসাইনমেন্ট অপারেটর একটি অগভীর অনুলিপি সম্পাদন করে। সুতরাং প্রাপ্তি অবজেক্টটি এখনও পয়েন্টারের মালিক এবং কোনও পরিবর্তন প্রকৃতপক্ষে মূল বস্তুকে প্রভাবিত করে;


1
হ্যাঁ, প্রোগ্রামে newএকটিও নেই delete। যদিও, এই কাজের জন্য এটি যথেষ্ট ভাল আমি মনে করি :)
রুস্লান


1
আমি যা বুঝি সে থেকে (সি ++ অনেক দূরে…), এখানে অ্যাসাইনমেন্টটি রাষ্ট্র পরিবর্তন করে না । অন্যথায়, coutলাইনটিকে আগে সরিয়ে নিয়ে যান }এবং এটি কাজ করে কিনা তা বলুন। :-)
নিকোলাস বারবুলেসকো

4

scala

অন্তর্ভুক্ত রূপান্তরগুলি আপনাকে একটি সাধারণ স্থানীয় ভেরিয়েবলের দায়িত্ব দেওয়ার সময় এটি সম্পাদন করতে দেয়:

import scala.language.implicitConversions

class Obj {
  var counter = 0
}

implicit def o2s(x: Obj): String = {
  x.counter += 1
  x.toString
}

val obj = new Obj
println(obj.counter)
val s: String = obj
println(obj.counter)

আপনি অনুমানকৃত ধরণের মাধ্যমেও তা সম্পাদন করতে পারেন:

var s = ""
s = obj

আপনি একটি কাস্টম সেটার পদ্ধতিও ব্যবহার করতে পারেন, যদিও এর ক্ষেত্রে ক্ষেত্র হতে L-মান প্রয়োজন:

object L {
  var _value = new Obj
  def value = _value
  def value_=(x: Obj): Unit = {
    _value = x
    x.counter += 1
  }
}

val obj = new Obj
println(obj.counter)
L.value = obj
println(obj.counter)

3

ডি

struct Obj {
    int state;

    void opAssign (ref Obj other) {
        ++other.state;
    }
}

void main () {
    import std.stdio;

    Obj obj, lvalue;
    writeln(obj);
    lvalue = obj;
    writeln(obj);
}

আউটপুট:

Obj(0)
Obj(1)

3

চুনি

প্রতিশ্রুতি হিসাবে, এখানে উত্তরটি প্রশ্নটি অনুপ্রাণিত করেছে।

obj = Class.new { def self.state; to_s[/</] ? "Has not been assigned\n" : "Assigned to #{to_s}"; end }

print obj.state

LValue = obj

print obj.state

Class.newএকটি বেনাম শ্রেণি তৈরি করে। to_sএকটি বেনাম শ্রেণিতে কল করা অবজেক্টগুলির ডিফল্ট স্ট্রিং প্রতিনিধিত্ব করে #<Class:0x007fe3b38ed958>। যাইহোক, একবার ক্লাসটি একটি ধ্রুবককে অর্পণ করা হলে,to_s তা ধ্রুব হয়ে যায়। রুবিতে, একটি ধ্রুবক একটি পরিবর্তনশীল যা বড় হাতের অক্ষর দিয়ে শুরু হয়, তাইobj বর্গের একটি উল্লেখ যা এটি বেনামে থাকতে দেয়।

আমার কোডটি to_sএকটি stateপদ্ধতিতে মোড়ানো , তাই আউটপুট হয়ে যায়

Has not been assigned
Assigned to LValue

এখানে বেশিরভাগ সমাধানের থেকে পৃথক, এটি কেবল একবারে কাজ করে: objঅন্য ধ্রুবককে অর্পণ করা তার স্ট্রিং প্রতিনিধিত্বকে পরিবর্তন করবে না এবং এর জন্য নতুন মানও বরাদ্দ করবে না LValue


3

জাভাতে

আমি ভেবেছিলাম জাভাতে এটি অসম্ভব। কিন্তু ...

প্রধান শ্রেণি:

public class MyAppOfCats {

  public static void main(String[] args) {
    Cat tom = new Cat();
    System.out.println(tom.state()); 
    // Output : NOT-BEST-CAT
    Cat.bestCat = tom;
    System.out.println(tom.state());
    // Output : BEST-CAT
  }

}

শ্রেণি বিড়াল:

public class Cat {

  static Cat bestCat;

  public Cat() {
    super();
  }

  public String state() {
      return ((this == Cat.bestCat) ? "BEST-CAT" : "NOT-BEST-CAT");
  }

}

আমি @bbt দ্বারা অনুপ্রাণিত হয়েছি।


1
আমি জানি এটি কোড-গল্ফ নয়, তবে আপনি বুঝতে পেরেছেন যে আপনি কেবল কনস্ট্রাক্টরকে সরাতে পারেন এবং এটি এখনও একই, তাই না?
ডেভিড কনরাড

2
এটি "এমন কোনও বিষয় নয় যা নিয়োগের ক্ষেত্রে রাষ্ট্রের পরিবর্তন হয়"। এটি আপনি একটি বিশ্বব্যাপী মানকে হেরফের করছেন এবং তারপরে এর ভিত্তিতে কিছু মুদ্রণ করছেন। এটি Cat.x = 2মুদ্রণের থেকে আলাদা নয় Cat.x
ক্রিস হেইস

@ ক্রিস - অবজেক্ট স্টেটটি একটি "গ্লোবাল মান" এর উপর ভিত্তি করে। সুতরাং অ্যাসাইনমেন্টের উপর অবজেক্টের স্থিতি পরিবর্তন হয়। প্রশ্নে বলা হয়েছে ;-) যে রাজ্যটি একটি বিপরীতমুখী, আদর্শবান পদ্ধতি হতে পারে। আমার পদ্ধতির অবস্থা () এমন একটি পদ্ধতি।
নিকোলাস বারবুলেসকো

না, এই নির্দিষ্ট অ্যাসাইনমেন্টের উপর অবজেক্টের স্থিতি পরিবর্তন হয় । আমি যদি করতাম Cat otherCat = tomতবে রাজ্যটি মোটেই বদলে যেত না। এটি নিয়মের চিঠি বা চেতনা পূরণ করে বিশ্বাস করতে আমার খুব কষ্ট হয় hard
ক্রিস হেইস

@ ক্রিস - অবশ্যই এই অ্যাসাইনমেন্টের উপর অবজেক্ট পরিবর্তন হয়! প্রশ্নটি এমন একটি অবজেক্টের জন্য জিজ্ঞাসা করে যাঁর রাষ্ট্র নিয়োগের দ্বারা পরিবর্তিত হয়। কোনও অবজেক্টের জন্য নয় যার রাজ্য কোনও অ্যাসাইনমেন্ট দ্বারা পরিবর্তিত হবে।
নিকোলাস বারবুলেসকো

3

সি ++

এই আচরণটি প্রকৃতপক্ষে স্ট্যান্ডার্ডে নির্দিষ্ট করা হয়েছে (এবং এজন্যই এটি হ্রাস করা হয়েছিল)।

#include<iostream>
#include<memory>
int main()
{
    std::auto_ptr<int> a(new int(0));
    std::cout<<a.get()<<'\n';
    std::auto_ptr<int> b = a;
    std::cout<<a.get()<<'\n';
}

আউটপুট

some address
0

যে প্রক্রিয়াটির কারণ এটি অভিজিটের উত্তরের মতো তবে কোনও প্রয়োজন ছাড়াই std::move অভিজিটের উত্তরের মতো তবে মেরিনাসের উত্তরের মতো এবং উত্তর না দিয়ে বরং এটি নিজেকে সংজ্ঞায়িত করার পরিবর্তে একটি মানক শ্রেণি ব্যবহার করে।

সম্পাদনা: আমি কিছু ব্যাখ্যা যোগ করছি। আউটপুটে, "কিছু ঠিকানা" বরাদ্দকৃত পূর্ণসংখ্যার ঠিকানার জন্য হ্যাক্সের মান হবে। std::auto_ptrঅন্যের কাছে নির্ধারিত হয়ে গেলে auto_ptrএর স্টোরের পয়েন্টার প্রকাশ করে এবং এর অভ্যন্তরীণ পয়েন্টারটি 0 তে সেট করে। কলিং get()স্টোর পয়েন্টারে অ্যাক্সেস পুনরুদ্ধার করে।


আমি সন্দেহ করি যে এখানে "আউটপুট" আসল আউটপুট নয়।
নিকোলাস বারবুলেসকো

এটি করার কি তা আপনি ব্যাখ্যা করতে পারেন? বিশেষত পদ্ধতি get()? কেন এটি শেষে 0 ফিরে আসবে?
নিকোলাস বারবুলেসকো

@ নিকোলাস হাঁ এই আউটপুটটি সত্যিকারের আউটপুট নয়, তবে আরও সাধারণ আউটপুট (আমারও একটি সংকলক অ্যাক্সেস ছিল না তাই আমার কাছে বৈধ ঠিকানার উদাহরণ নেই)।
জে.কোর

1
এইচএম, এটি জিসিসি 4.8 এ সংকলন করতে ব্যর্থ।
মাইকেল হ্যাম্পটন

1
সংকলনের ত্রুটিগুলি স্থির করেছি। আপনি সি ++ 11 এর জন্য সংকলন করছেন তবে হ্রাস করা হয়েছে বলে সতর্কতা রয়েছে auto_ptr
জে.কোর


2

পাইথন 2.x

আমি অতিরিক্ত ক্লাস সংজ্ঞায়িত না করে এটি করার উপযুক্ত উপায় খুঁজে পাচ্ছি না।

class State(object):
    def __init__(self):
        self.state = 0
    def __set__(self, obj, other):
        # Keep different references
        other.state += 1
        self.state += 2

class Program(object):
    obj, value = State(), State() # Create two State-objects
    def __init__(self):
        print "Before assignment:", self.obj.state, self.value.state # 0 0
        self.value = self.obj # Set value to obj (supposedly)
        print "After  assignment:", self.obj.state, self.value.state # 1 2
        self.value = self.obj
        print "2nd    assignment:", self.obj.state, self.value.state # 2 4

Program()

2

জাভা

অন্যান্য সমস্ত সমাধান অপারেটর ওভারলোডিংয়ের ভাষার ফর্ম ব্যবহার করে। জাভাতে অপারেটর ওভারলোডিং নেই, তাই আমি ভেবেছিলাম আমি আটকে গিয়েছিলাম। তবে আমি কিছু নিয়ে এসেছি।

এখানে প্রধান বর্গ:

public class Program {
    public static void main(String[] args) {
        Thing thing = new Thing(0);
        System.out.println(thing.getState());
        Thing.otherThing = thing;
        Thread.sleep(1);
        System.out.println(thing.getState());
    }
}

কয়েকটি সন্দেহজনক লাইন রয়েছে তবে Thingশ্রেণি সম্পূর্ণ স্বাভাবিক থাকলে তারা কিছু করবে না । এটি নয়:

public class Thing {
    private int state;

    public Thing(int state) {
        this.state = state;
    }

    public int getState() {
        return state;
    }

    // Please do your best to ignore the rest of this class.
    public static volatile Thing otherThing;
    static {
        Thread t = new Thread() {
            public void run() {
                Thing t = otherThing;
                while (true)
                    if (t != otherThing) {
                        t = otherThing;
                        t.state++;
                    }
            }
        };
        t.setDaemon(true);
        t.start();
    }
}

থ্রেডগুলির কারণে এটি কাজ করার গ্যারান্টিযুক্ত নয়, তবে আমি এটি জেডিকে 1.8u5 এ পরীক্ষা করেছি এবং এটি সেখানে কাজ করে।



@ কাইলকানোস সমস্ত ইউনিকোড চরগুলি> ইউ + 00 এফএফ
tbodt

1

কমন লিস্প

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

(defgeneric state (object)
  (:documentation "Get the state of this object."))

(defmethod state ((object vector))
  ;; The state of a vector is the number of symbols bound to it.
  (let ((count 0))
    ;; Iterate each SYM, return COUNT.
    (do-all-symbols (sym count)
      ;; When SYM is bound to this vector, increment COUNT.
      (when (and (boundp sym) (eq (symbol-value sym) object))
    (incf count)))))

(defparameter *a* #(this is a vector))
(defparameter *b* nil)
(defparameter *c* nil)

(print (state *a*))
(setf *b* *a*)
(print (state *a*))
(print (state *a*))
(setf *c* *a*)
(print (state *a*))

আউটপুট:

1 
2 
2 
3 

এটি কেবল বিশেষ ভেরিয়েবলের সাথে অ্যাসাইনমেন্ট নিয়ে কাজ করে, লেজিকাল ভেরিয়েবলগুলিতে নয়, কোনও বস্তুর মধ্যে স্লটগুলিতেও নয়।

সাবধান! do-all-symbols সমস্ত প্যাকেজ দেখায়, তাই এটি ভেরিয়েবল এমন কোনো প্যাকেজ আছে ব্যার্থ। এটি একাধিক প্যাকেজে বিদ্যমান চিহ্নগুলি দ্বিগুণ গণনা করতে পারে (যখন একটি প্যাকেজ অন্য প্যাকেজ থেকে প্রতীক আমদানি করে)।

চুনি

রুবি প্রায় একই, তবে আমি স্থিতি সংজ্ঞায়িত করাকে স্থির সংখ্যার হিসাবে সংজ্ঞায়িত করি।

class Array
  # Get the state of this object.
  def state
    # The state of an array is the number of constants in modules
    # where the constants refer to this array.
    ObjectSpace.each_object(Module).inject(0) {|count, mod|
      count + mod.constants(false).count {|sym|
        begin
          mod.const_get(sym, false).equal?(self)
        rescue NameError
          false
        end
      }
    }
  end
end

A = %i[this is an array]
puts A.state
B = A
puts A.state
puts A.state
C = A
puts A.state

আউটপুট:

state-assign.rb:9:in `const_get': Use RbConfig instead of obsolete and deprecated Config.
1
2
2
3

ক্লাস বা মডিউল নয় এমন রুবি অবজেক্টগুলির জন্য হিস্টোক্র্যাট জবাবের এটি একটি সাধারণীকরণ । সতর্কবার্তাটি উপস্থিত হয় কারণ কনফিগার ধ্রুবকটি এমন কিছু কোডকে অটোলোড করে যা সতর্কতা তৈরি করে।


0

সি ++

ফলাফল বিভিন্ন প্ল্যাটফর্মে পৃথক হতে পারে। আদর্শের উপর পরীক্ষিত

#include <iostream>
#include <cassert>
// File format: [ciiiiciiii...] a char (1 byte) followed by its state (4 bytes)
// Each group takes 5 bytes
char Buffer[30]; // 5*6, six groups

struct Group {
    char c;
    int state;
};

int main(void) {
    assert(sizeof(char) == 1);
    assert(sizeof(int) == 4);

    Group& first_group = *(Group*)(&Buffer[0]); // Group 1 is at 0
    Group& second_group = *(Group*)(&Buffer[5]); // Group 2 is at 5

    first_group.c = '2';
    first_group.state = 1234;

    std::cout << first_group.state << std::endl;

    second_group = first_group;

    std::cout << first_group.state << std::endl;

    return 0;
}

আউটপুট:

1234
13010

0

সি শার্প

class A
{
    public int N { get; set; }
    public override string ToString() { return N.ToString(); }
}
class B
{
    public int N { get; set; }
    public override string ToString() { return N.ToString(); }
    public static implicit operator A(B b) { b.N = -b.N; return new A { N = b.N }; }
}
public static void Test()
{
    A a = new A { N = 1 };
    B b = new B { N = 2 };
    Console.WriteLine("a is {0}, b is {1}", a, b);
    Console.WriteLine("a is {0}, b is {1}", a, b);
    a = b;
    Console.WriteLine("a is {0}, b is {1}", a, b);
    Console.WriteLine("a is {0}, b is {1}", a, b);
}

আউটপুট:

a is 1, b is 2
a is 1, b is 2
a is -2, b is -2
a is -2, b is -2

এটি কি করে? এটি কি অপারেটরটি ওভারলোড হচ্ছে =?
নিকোলাস বারবুলেসকো

@ নিকোলাস ঠিক নেই যখন একটি থেকে কাস্ট করা হচ্ছে Bএকটি থেকে Aকারণ, implicit operator A(B b)পার্শ্ব প্রতিক্রিয়া হয়েছে।
ক্লিকরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.