شیءها میتوانند با تعیین متغیرهای نمونه، وضعیت خودشان را نگه دارند. این متغیرها درون یک شیء قرار دارند و معمولاً برای ذخیرهی مقداری وضعیت درونی به کار میروند.
متغیرهای نمونه همیشه با @ شروع میشوند.
میتوانید با تعیین متغیری که با یک @ شروع میشود، یک متغیر نمونهی تازه بسازید.
برای مثال:
class Repeater
def hear(something)
# Save what's been heard into a new instance variable called @heard
@heard = something
end
def repeat
# Return the value of the instance variable
@heard
end
end
repeater = Repeater.new
repeater.hear("Hello, friend!")
print repeater.repeat # Prints "Hello, friend!"
شیءها معمولاً وضعیت اولیهی خود را در متدی به نام initialize تعیین میکنند که هنگام فراخوانی new روی یک کلاس بهطور خودکار فراخوانی میشود.
class Airplane
def initialize
@wings = 2
end
def wings
@wings
end
end
plane = Airplane.new
plane.wings # returns 2
متد initialize میتواند آرگومان هم بگیرد تا هر نمونه بتواند با وضعیتی سفارشی شروع کند:
class Suitcase
def initialize(locked)
@locked = locked
end
end
کار خوبی است که متغیرهای نمونه را از خواندن و نوشتنِ بیرونی خصوصی در نظر بگیریم. در عوض، متدهایی تعریف میکنیم که مقدارشان را بگیرند و تعیین کنند. برای مثال:
class Suitcase
def initialize
@locked = false
end
def locked? # Query methods should be named with a trailing `?`
@locked
end
def lock! # Methods which mutate state should have trailing `!`
@locked = true
end
end
suitcase = Suitcase.new
suitcase.locked? # false
suitcase.lock!
suitcase.locked? # true
Nil واژهای انگلیسی به معنای «هیچ» یا «صفر» است.
در Ruby، از nil برای بیان نبودِ یک شیء استفاده میشود.
در زبانهای برنامهنویسی دیگر، مقادیر null یا none ممکن است نقش مشابهی ایفا کنند.
# I do not have a favorite color
favorite_color = nil
Ruby به هر متغیر نمونه، وقتی برای نخستین بار با آن روبهرو میشود، مقدار پیشفرض nil را میدهد، تا زمانی که مقدار دیگری به آن داده شود.
print @favourite_color # prints nil
@favourite_color = "blue"
print @favourite_color # prints "blue"
شما در یک شهربازی کار میکنید و مشخصاتی به شما داده شده است تا سامانهای را برای مدیریت ورود بازدیدکنندگان و وسایل بازی طراحی کنید. وظیفهی شما مدلسازی بازدیدکننده (شخصی که از پارک بازدید میکند) است.
متد Attendee#initialize از کلاس Attendee را پیادهسازی کنید؛ این متد باید یک قد (به سانتیمتر) بگیرد و آن را در یک «متغیر نمونه» ذخیره کند.
Attendee.new(106)
# => #<Attendee:0x000055c33e6c7e18 @height=106>
متد گیرندهی Attendee#height از کلاس Attendee را پیادهسازی کنید؛ این متد باید قد نمونه را برگرداند.
Attendee.new(106).height
# => 106
همهی بازدیدکنندهها بلیت سواری نخریدهاند، اما باید بدانیم بلیت دارند یا نه. متد گیرندهی Attendee#pass_id را برای کلاس Attendee پیادهسازی کنید؛ این متد باید pass_id نمونه را برگرداند، یا اگر بازدیدکننده بلیت ندارد، nil را برگرداند.
Attendee.new(106).pass_id
# => nil
متد Attendee#issue_pass! را پیادهسازی کنید تا وضعیت نمونه را تغییر دهد و متغیر نمونهی شناسهی بلیت را برابر آرگومان قرار دهد. این متد باید شناسهی بلیت را برگرداند.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.pass_id
# => 42
برخی مهمانها با رفتار ناایمن قوانین را زیر پا میگذارند، بنابراین پارک میخواهد بتواند بلیتها را باطل کند. متد Attendee#revoke_pass! را پیادهسازی کنید تا وضعیت نمونه را تغییر دهد و شناسهی بلیت را برابر nil قرار دهد.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.revoke_pass!
attendee.pass_id
# => nil