මට රූබිattr_accessor
ගැන තේරුම් ගැනීමට අපහසුය .
යමෙකුට මෙය මට පැහැදිලි කළ හැකිද?
git
කිසිම සම්බන්ධයක් නැත attr_accessor
. Git යනු අනුවාද පාලන මෘදුකාංගයක් වන අතර රූබිattr_accessor
හි ක්රමයකි .
මට රූබිattr_accessor
ගැන තේරුම් ගැනීමට අපහසුය .
යමෙකුට මෙය මට පැහැදිලි කළ හැකිද?
git
කිසිම සම්බන්ධයක් නැත attr_accessor
. Git යනු අනුවාද පාලන මෘදුකාංගයක් වන අතර රූබිattr_accessor
හි ක්රමයකි .
Answers:
අපි ඔබට පන්තියක් ඇති බව කියමු Person
.
class Person
end
person = Person.new
person.name # => no method error
නිසැකවම අපි කිසි විටෙකත් ක්රමය නිර්වචනය කර නැත name
. අපි ඒක කරමු.
class Person
def name
@name # simply returning an instance variable @name
end
end
person = Person.new
person.name # => nil
person.name = "Dennis" # => no method error
ආහා, අපට නම කියවිය හැකිය, නමුත් එයින් අදහස් කරන්නේ අපට නම පැවරිය හැකි බවයි. ඒවා වෙනස් ක්රම දෙකකි. හිටපු ලෙස හැඳින්වේ පාඨකයා හා අග ලෙස හැඳින්වේ ලේඛකයා . අපි තවම ලේඛකයා නිර්මාණය කර නැත, එබැවින් අපි එය කරමු.
class Person
def name
@name
end
def name=(str)
@name = str
end
end
person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"
නියමයි. දැන් අපට පා variable @name
කයා සහ ලේඛක ක්රම භාවිතා කරමින් නිදර්ශන විචල්යය ලිවීමට හා කියවීමට හැකිය . හැර, මෙය නිතර නිතර සිදු කරනු ලැබේ, සෑම විටම මෙම ක්රම ලිවීමට කාලය නාස්ති කරන්නේ ඇයි? අපට එය පහසුවෙන් කළ හැකිය.
class Person
attr_reader :name
attr_writer :name
end
මෙය පවා පුනරාවර්තනය විය හැකිය. ඔබට අවශ්ය විට පා er කයා සහ ලේඛකයා යන දෙදෙනාම ප්රවේශය භාවිතා කරන්න!
class Person
attr_accessor :name
end
person = Person.new
person.name = "Dennis"
person.name # => "Dennis"
එකම ආකාරයකින් ක්රියා කරයි! කුමක් දැයි අනුමාන කරන්න: @name
අපගේ පුද්ගල වස්තුවෙහි නිදර්ශන විචල්යය අප විසින් අතින් කළ ආකාරයටම සැකසෙනු ඇත, එබැවින් ඔබට එය වෙනත් ක්රම වලින් භාවිතා කළ හැකිය.
class Person
attr_accessor :name
def greeting
"Hello #{@name}"
end
end
person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"
ඒක තමයි. ඇත්ත වශයෙන්ම ඔබ සඳහා ක්රම ජනනය කරන්නේ කෙසේද සහ ක්රම තේරුම් ගැනීමට attr_reader
, වෙනත් පිළිතුරු, පොත්, රූබි ලියකියවිලි කියවන්න.attr_writer
attr_accessor
attr_accessor
එය වර්තමාන පන්තියට කැඳවන ක්රමයක් වන අතර :name
එය එම ක්රමයට ඔබ යොමු කරන පරාමිතියකි. එය විශේෂ වාක්ය ඛණ්ඩයක් නොවේ, එය සරල ක්රම ඇමතුමකි. ඔබ එයට @name
විචල්යතාවයක් ලබා දෙන්නේ නම් , එය තේරුමක් නැත, මන්ද @name අඩංගු වේ nil
. එබැවින් එය ලිවීම හා සමාන වනු ඇත attr_accessor nil
. ඔබ එය නිර්මාණය කිරීමට අවශ්ය විචල්යයක් පසුකරන්නේ නැත, ඔබ විචල්යය හැඳින්වීමට අවශ්ය නම පසුකරමින් සිටී.
name
සහ විචල්යය @name
එකම දෙයක් නොවේ. ඒවා පටලවා නොගන්න. @name
ඔබේ පන්තියේ නිදර්ශන විචල්යයක් ඇති අතර attr_reader :name
එය පිටතින් කියවිය හැකි යැයි ඔබ අර්ථ දක්වයි . තොරව attr_reader
ඔබට ප්රවේශ විය හැකි සරල ක්රමයක් පවතින @name
ඔබගේ පන්තියේ පිටත.
attr_accessor යනු ක්රමයක් පමණි . (සබැඳිය එය ක්රියාත්මක වන ආකාරය පිළිබඳ වැඩි අවබෝධයක් ලබා දිය යුතුය - ජනනය කරන ලද ක්රම යුගල දෙස බලන්න, නිබන්ධනයක් මඟින් එය භාවිතා කරන ආකාරය පෙන්වයි.)
මෙම තේමාව තමයි class
වන්නේ එය නිර්වචනය රූබි දී (එය C ++, සහ ජාවා වැනි භාෂා "පමණක් අර්ථ දැක්වීම" වන), නමුත් එය අපේ ඇගයීමට බව ප්රකාශ . මෙම ඇගයීම අතරතුරදී attr_accessor
ක්රමය ක්රියාත්මක කරන විට එය වත්මන් පන්තිය වෙනස් කරයි - ව්යංග ග්රාහකය මතක තබා ගන්න : self.attr_accessor
,self
මෙම අවස්ථාවෙහිදී “විවෘත” පන්ති වස්තුව ?
attr_accessor
මිතුරන්ගේ අවශ්යතාවය , හොඳයි:
ස්මාල්ටෝක් වැනි රූබි, එම වස්තුව සඳහා ක්රම 1 ට පිටතින් නිදර්ශන විචල්යයන්ට ප්රවේශ වීමට ඉඩ නොදේ . එනම් x.y
, ජාවා හෝ පයිතන් වැනි සුලභව දක්නට ලැබෙන ආකාරයට නිදර්ශන විචල්යයන්ට ප්රවේශ විය නොහැක . රූබි y
හි සෑම විටම යැවීමට පණිවිඩයක් ලෙස ගනු ලැබේ (හෝ "ඇමතීමේ ක්රමය"). මේ අනුව attr_*
ක්රම මඟින් @variable
ගතිකව නිර්මාණය කරන ලද ක්රම හරහා නිදර්ශන ප්රවේශය ප්රොක්සි කරන ආවරණ නිර්මාණය කරයි.
බොයිලර් ප්ලේට් උරා ගනී
මෙය කුඩා විස්තර කිහිපයක් පැහැදිලි කරයි යැයි සිතමු. සතුටු කේතීකරණය.
[1] මෙය තදින්ම සත්ය නොවන අතර මේ වටා සමහර “ශිල්පීය ක්රම” ඇත , නමුත් “පොදු නිදර්ශන විචල්ය” ප්රවේශය සඳහා සින්ටැක්ස් සහාය නොමැත.
attr_accessor
(stpst ප්රකාශ කළ පරිදි) ක්රමයක් පමණි. එය කරන්නේ ඔබ වෙනුවෙන් තවත් ක්රම නිර්මාණය කිරීමයි.
එබැවින් මෙම කේතය මෙහි:
class Foo
attr_accessor :bar
end
මෙම කේතයට සමාන වේ:
class Foo
def bar
@bar
end
def bar=( new_value )
@bar = new_value
end
end
ඔබට රූබි භාෂාවෙන් මෙවැනි ක්රමයක් ලිවිය හැකිය:
class Module
def var( method_name )
inst_variable_name = "@#{method_name}".to_sym
define_method method_name do
instance_variable_get inst_variable_name
end
define_method "#{method_name}=" do |new_value|
instance_variable_set inst_variable_name, new_value
end
end
end
class Foo
var :bar
end
f = Foo.new
p f.bar #=> nil
f.bar = 42
p f.bar #=> 42
attr_accessor
අවසානයේ මෙහි හමු විය! එය මගේ ගැටලුව විසඳුවද, (පොත් / නිල ලේඛනය) මට මෙවැනි ක්රියාත්මක කිරීමේ උදාහරණයක් සොයාගත හැක්කේ කොහෙන්දැයි දැන ගැනීමට මට කුතුහලයක් තිබේද?
attr_accessor
ඉතා සරලයි:
attr_accessor :foo
සඳහා කෙටිමඟකි:
def foo=(val)
@foo = val
end
def foo
@foo
end
එය වෙනත් දෙයක් නොවේ
මූලික වශයෙන් ඒවා රූබි සතුව නැති ප්රසිද්ධියේ ප්රවේශ විය හැකි දත්ත ගුණාංග ව්යාජ ය.
එය නිදර්ශන විචල්යයන් සඳහා ගෙටර් සහ සෙටර් ක්රම නිර්වචනය කරන ක්රමයක් පමණි. උදාහරණයක් ලෙස ක්රියාත්මක කිරීම:
def self.attr_accessor(*names)
names.each do |name|
define_method(name) {instance_variable_get("@#{name}")} # This is the getter
define_method("#{name}=") {|arg| instance_variable_set("@#{name}", arg)} # This is the setter
end
end
ඔබ OOP සංකල්පය ගැන හුරුපුරුදු නම්, ඔබ getter සහ setter ක්රමයට හුරු විය යුතුය. attr_accessor රූබි වලද එසේ කරයි.
සාමාන්ය ආකාරයෙන් ගෙටර් සහ සෙටර්
class Person
def name
@name
end
def name=(str)
@name = str
end
end
person = Person.new
person.name = 'Eshaan'
person.name # => "Eshaan"
සැකසුම් ක්රමය
def name=(val)
@name = val
end
ලබා ගැනීමේ ක්රමය
def name
@name
end
රූබි හි ගෙටර් සහ සෙටර් ක්රමය
class Person
attr_accessor :name
end
person = Person.new
person.name = "Eshaan"
person.name # => "Eshaan"
ඉහත පිළිතුරු බොහොමයක් කේත භාවිතා කරයි. මෙම පැහැදිලි කිරීම ප්රතිසමයක් / කතාවක් හරහා කිසිවක් භාවිතා නොකර එයට පිළිතුරු දීමට උත්සාහ කරයි:
බාහිර පාර්ශවයන්ට අභ්යන්තර සීඅයිඒ රහස් වෙත පිවිසිය නොහැක
සැබවින්ම රහසිගත ස්ථානයක් ගැන සිතමු: සීඅයිඒ. සීඅයිඒ තුළ සිටින පුද්ගලයින් හැර සීඅයිඒ හි සිදුවන්නේ කුමක්දැයි කිසිවෙකු දන්නේ නැත. වෙනත් වචන වලින් කිවහොත්, බාහිර පුද්ගලයින්ට සීඅයිඒ හි කිසිදු තොරතුරකට ප්රවේශ විය නොහැක. නමුත් සම්පූර්ණයෙන්ම රහසිගත සංවිධානයක් තිබීම හොඳ නැති නිසා, ඇතැම් තොරතුරු බාහිර ලෝකයට ලබා දී ඇත - සීඅයිඒ ආයතනය සැබවින්ම සැවොම දැන ගැනීමට කැමති දේවල් පමණි: උදා: සීඅයිඒ අධ්යක්ෂ, මෙම දෙපාර්තමේන්තුව කෙතරම් පරිසර හිතකාමීද යන්න අනෙකුත් සියලුම රජයේ දෙපාර්තමේන්තු වෙත යනාදිය. වෙනත් තොරතුරු: උදා: ඉරාකයේ හෝ ඇෆ්ගනිස්ථානයේ එහි රහසිගත ක්රියාකාරීන් කවුරුන්ද - මේ ආකාරයේ දේවල් ඉදිරි වසර 150 සඳහා රහසක්ව පවතිනු ඇත.
ඔබ සීඅයිඒ වෙතින් පිටත නම් ඔබට ප්රවේශ විය හැක්කේ එය මහජනයාට ලබා දී ඇති තොරතුරු පමණි. නැතහොත් සීඅයිඒ උපභාෂාව භාවිතා කිරීමට ඔබට ප්රවේශ විය හැක්කේ “නිෂ්කාශනය” කළ තොරතුරු පමණි.
සීඅයිඒ ආයතනයෙන් පිටත සාමාන්ය ජනතාවට ලබා දීමට සීඅයිඒට අවශ්ය තොරතුරු හැඳින්වෙන්නේ: ගුණාංග.
කියවීමේ හා ලිවීමේ ගුණාංගවල තේරුම:
සීඅයිඒ සම්බන්ධයෙන් ගත් කල, බොහෝ ගුණාංග "කියවීමට පමණි". මෙයින් අදහස් කරන්නේ ඔබ සීඅයිඒ වෙතින් බාහිර පක්ෂයක් නම් , ඔබට ඇසිය හැකිය : "සීඅයිඒ හි අධ්යක්ෂ කවුද?" එවිට ඔබට answer ජු පිළිතුරක් ලැබෙනු ඇත. "කියවීමට පමණි" ගුණාංග සමඟ ඔබට කළ නොහැකි දෙය නම් සීඅයිඒ හි වෙනස්කම් සිදු කිරීමයි. ඔබට දුරකථන ඇමතුමක් හදිසියේ නොහැකි උදා තීරණය ඔබ කිම් Kardashian අධ්යක්ෂ, හෝ ඔබ පැරිස් හිල්ටන් සේනාධිනායකයා වීමට අවශ්ය බව අවශ්ය බව.
ගුණාංග ඔබට "ලිවීමට" ප්රවේශය ලබා දුන්නේ නම්, ඔබට අවශ්ය නම්, ඔබ පිටත සිටියත් ඔබට වෙනස්කම් කළ හැකිය. එසේ නොමැතිනම් ඔබට කළ හැකි එකම දෙය කියවීම පමණි.
වෙනත් වචන වලින් කිවහොත්, ප්රවේශයන් කියවීමට හෝ ලිවීමට ප්රවේශ වන්නන් මත පදනම්ව බාහිර පුද්ගලයින්ට ඇතුළුවීමට ඉඩ නොදෙන සංවිධාන වෙත විමසීම් කිරීමට හෝ වෙනස්කම් කිරීමට ප්රවේශයන් ඔබට ඉඩ දෙයි.
පංතියක් තුළ ඇති වස්තූන් පහසුවෙන් එකිනෙකාට ප්රවේශ විය හැකිය
පංති සමඟ එකම දේ සහ ඒවා තුළ විචල්යයන්, ගුණාංග සහ ක්රම වලට ප්රවේශ වීමට ඇති හැකියාව. HTH! ඕනෑම ප්රශ්නයක්, කරුණාකර විමසන්න, මට පැහැදිලි කර ගත හැකි යැයි මම බලාපොරොත්තු වෙමි.
මමත් මෙම ගැටලුවට මුහුණ දුන් අතර මෙම ප්රශ්නයට තරමක් දීර් answer පිළිතුරක් ලිව්වෙමි. මේ පිළිබඳව දැනටමත් හොඳ පිළිතුරු කිහිපයක් ඇත, නමුත් වැඩි පැහැදිලි කිරීමක් අපේක්ෂා කරන ඕනෑම කෙනෙකුට, මගේ පිළිතුරට උපකාර කළ හැකි යැයි මම විශ්වාස කරමි
ක්රමය ආරම්භ කරන්න
ඔබ පන්තියේ නව අවස්ථාවක් නිර්මාණය කරන සෑම අවස්ථාවකම ඔබේ කේතයේ වෙනම පේළියක ඒවා සැකසීමට වඩා, නිදසුනක් නිර්මාණය කිරීමෙන් පසු වස්තුවක උදාහරණයකට දත්ත සැකසීමට ආරම්භ කිරීම ඔබට ඉඩ දෙයි.
class Person
def initialize(name)
@name = name
end
def greeting
"Hello #{@name}"
end
end
person = Person.new("Denis")
puts person.greeting
ඉහත කේතය තුළ අපි ආරම්භක පරාමිතිය හරහා ඩෙනිස් පසුකරමින් ආරම්භක ක්රමය භාවිතා කරමින් “ඩෙනිස්” යන නම සකසමු. ආරම්භක ක්රමයකින් තොරව නම සැකසීමට අපට අවශ්ය නම් අපට මෙය කළ හැකිය:
class Person
attr_accessor :name
# def initialize(name)
# @name = name
# end
def greeting
"Hello #{name}"
end
end
person = Person.new
person.name = "Dennis"
puts person.greeting
ඉහත කේතයේ දී, අපි වස්තුව ආරම්භ කිරීමෙන් පසු අගයන් සැකසීමට වඩා person.name භාවිතා කරමින් attr_accessor setter ක්රමයට ඇමතුමක් ලබා දෙමු.
මෙම කාර්යය කිරීමේ “ක්රම” දෙකම, නමුත් ආරම්භ කිරීමෙන් අපට කාලය සහ කේත රේඛා ඉතිරි වේ.
ආරම්භ කිරීමේ එකම කාර්යය මෙයයි. ඔබට ක්රමයක් ලෙස ආරම්භ කිරීම ඉල්ලා සිටිය නොහැක. නිදර්ශන වස්තුවක අගයන් සැබවින්ම ලබා ගැනීම සඳහා ඔබ getters සහ setters (attr_reader (get), attr_writer (set) සහ attr_accessor (දෙකම) භාවිතා කළ යුතුය. ඒවා පිළිබඳ වැඩි විස්තර සඳහා පහත බලන්න.
Getters, Setters (attr_reader, attr_writer, attr_accessor)
Getters, attr_reader: ලබා ගන්නෙකුගේ සම්පූර්ණ අරමුණ විශේෂිත නිදර්ශන විචල්යයක අගය නැවත ලබා දීමයි. මෙය බිඳවැටීම සඳහා පහත නියැදි කේතය බලන්න.
class Item
def initialize(item_name, quantity)
@item_name = item_name
@quantity = quantity
end
def item_name
@item_name
end
def quantity
@quantity
end
end
example = Item.new("TV",2)
puts example.item_name
puts example.quantity
ඉහත කේතයේ ඔබ අයිතමය “උදාහරණය” සඳහා “item_name” සහ “ප්රමාණය” යන ක්රම අමතයි. “උදාහරණ තබයි.
වාසනාවකට මෙන් රූබි හි මෙම කේතය වඩාත් සංක්ෂිප්තව ලිවීමට අපට ඉඩ සලසන සහජ ක්රමයක් තිබේ; attr_reader ක්රමය. පහත කේතය බලන්න;
class Item
attr_reader :item_name, :quantity
def initialize(item_name, quantity)
@item_name = item_name
@quantity = quantity
end
end
item = Item.new("TV",2)
puts item.item_name
puts item.quantity
මෙම වාක්ය ඛණ්ඩය හරියටම එකම ආකාරයකින් ක්රියා කරයි, එය අපට කේත පේළි හයක් ඉතිරි කරයි. අයිතම පන්තියට තවත් රාජ්ය 5 ක් ආරෝපණය කර ඇත්දැයි සිතා බලන්න? කේතය ඉක්මනින් දිගු වේ.
සෙටර්ස්, attr_writer: සෙටර් ක්රම මගින් මුලදී මා පසුකර ගිය දෙය නම් ආරම්භක ක්රමයට සමාන කාර්යයක් මගේ ඇස් හමුවේ පෙනෙන්නට තිබීමයි. මගේ අවබෝධය මත පදනම්ව මම පහත වෙනස පැහැදිලි කරමි;
පෙර සඳහන් කළ පරිදි, ආරම්භක ක්රමය මඟින් වස්තුවක් නිර්මාණය කිරීමේදී වස්තුවක නිදසුනක් සඳහා අගයන් සැකසීමට ඉඩ ලබා දේ.
නමුත් ඔබට අගයන් පසුව සැකසීමට අවශ්ය නම්, උදාහරණය නිර්මාණය කිරීමෙන් පසුව හෝ ඒවා ආරම්භ කිරීමෙන් පසුව ඒවා වෙනස් කිරීමට ඔබට අවශ්ය නම් කුමක් කළ යුතුද? මෙය ඔබ සැකසුම් ක්රමයක් භාවිතා කරන අවස්ථාවක් වනු ඇත. ඒක තමයි වෙනස. ඔබ මුලින් attr_writer ක්රමය භාවිතා කරන විට විශේෂිත තත්වයක් “සැකසීමට” අවශ්ය නොවේ.
පහත දැක්වෙන කේතය අයිතම පන්තියේ මෙම අවස්ථාව සඳහා අයිතමයේ නම අගය ප්රකාශ කිරීම සඳහා සැකසුම් ක්රමයක් භාවිතා කිරීමේ උදාහරණයකි. ඔබට කේතය තනිවම පරීක්ෂා කිරීමට අවශ්ය වූ විට අපට අගයන් ලබා ගැනීමට සහ ඒවා තිරයට මුද්රණය කිරීමට හැකි වන පරිදි අපි දිගටම getr method attr_reader භාවිතා කරන බව සැලකිල්ලට ගන්න.
class Item
attr_reader :item_name
def item_name=(str)
@item_name = (str)
end
end
පහත කේතය attr_writer භාවිතා කර අපගේ කේතය නැවත කෙටි කිරීමට සහ අපට කාලය ඉතිරි කර ගැනීමට උදාහරණයකි.
class Item
attr_reader :item_name
attr_writer :item_name
end
item = Item.new
puts item.item_name = "TV"
පහත කේතය යනු අයිතමය_ නාමයේ වස්තු අගය නිර්මාණය කිරීමේදී සැකසීමට අප විසින් ආරම්භක භාවිතා කරන ස්ථානයට ඉහළින් ඇති ආරම්භක උදාහරණය පුනරාවර්තනය කිරීමයි.
class Item
attr_reader :item_name
def initialize(item_name)
@item_name = item_name
end
end
item = Item.new("TV")
puts item.item_name
attr_accessor: attr_reader සහ attr_writer යන දෙකෙහිම කාර්යයන් ඉටු කරයි, ඔබට තවත් කේත පේළියක් ඉතිරි කරයි.
මම හිතන්නේ නව රුබීවාදීන් / ක්රමලේඛකයින් (මා වැනි) ව්යාකූල කරන දෙයින් කොටසක්:
"එයට කිසියම් ලක්ෂණයක් (උදා: නම) ඇති බව මට පැවසිය නොහැක්කේ ඇයි? එම ගුණාංගයට එකවරම වටිනාකමක් ලබා දිය හැකිද?"
තව ටිකක් සාමාන්යකරණය කර ඇත, නමුත් මෙය මා සඳහා ක්ලික් කළ ආකාරය මෙයයි:
ලබා දී ඇත්තේ:
class Person
end
පුද්ගලයා සඳහා නමක් හෝ වෙනත් ගුණාංග තිබිය හැකි දෙයක් ලෙස අපි අර්ථ දක්වා නැත .
ඉතින් අපි එසේ නම්:
baby = Person.new
... ඔවුන්ට නමක් දීමට උත්සාහ කරන්න ...
baby.name = "Ruth"
අපට දෝෂයක් ඇති වන්නේ, රුබිලන්ඩ්හි, පුද්ගල පන්තියේ වස්තුවක් "නමක්" සමඟ සම්බන්ධ වී ඇති හෝ හැකියාවක් ඇති දෙයක් නොවන නිසාය ... තවමත්!
නමුත් අපට ලබා දී ඇති ඕනෑම ක්රමයක් (පෙර පිළිතුරු බලන්න) කීමට ක්රමයක් ලෙස භාවිතා කළ හැකිය, “පුද්ගල පන්තියක ( baby
) දැන් උදාහරණයක් ලෙස 'නම' යනුවෙන් ගුණාංගයක් තිබිය , එබැවින් අපට ලබා ගත හැකි සින්ටැක්ටිකල් ක්රමයක් පමණක් නොව එම නම සැකසීම, නමුත් අපට එය කිරීම අර්ථවත් කරයි.
නැවතත්, මෙම ප්රශ්නයට තරමක් වෙනස් හා සාමාන්ය කෝණයකින් පහර දීම, නමුත් මෙම ත්රෙඩ් එකට යන මාර්ගය සොයා ගන්නා පන්තියේ පුද්ගලයාගේ ඊළඟ අවස්ථාව සඳහා මෙය උපකාරී වනු ඇතැයි මම බලාපොරොත්තු වෙමි.
සරලව කිවහොත් එය පන්තිය සඳහා කට්ටලයක් සහ ලබා ගන්නෙකු අර්ථ දක්වනු ඇත.
එය සටහන් කර ගන්න
attr_reader :v is equivalant to
def v
@v
end
attr_writer :v is equivalant to
def v=(value)
@v=value
end
නිසා
attr_accessor :v which means
attr_reader :v; attr_writer :v
පංතිය සඳහා කට්ටලයක් සහ ලබා ගන්නෙකු නිර්වචනය කිරීමට සමාන වේ.
එය වටහා ගත හැකි තවත් ක්රමයක් නම්, එය තිබීමෙන් ඉවත් කරන්නේ කුමන දෝෂ කේතයද attr_accessor
යන්නයි.
උදාහරණයක්:
class BankAccount
def initialize( account_owner )
@owner = account_owner
@balance = 0
end
def deposit( amount )
@balance = @balance + amount
end
def withdraw( amount )
@balance = @balance - amount
end
end
පහත දැක්වෙන ක්රම තිබේ:
$ bankie = BankAccout.new("Iggy")
$ bankie
$ bankie.deposit(100)
$ bankie.withdraw(5)
පහත දැක්වෙන ක්රම මඟින් දෝෂ ඇතිවේ:
$ bankie.owner #undefined method `owner'...
$ bankie.balance #undefined method `balance'...
owner
හා balance
නෑ, තාක්ෂණික, වේ ක්රමයක් , නමුත් විශ්ලේෂණයක්. BankAccount පන්තියට නැත def owner
සහ def balance
. එය එසේ නම්, ඔබට පහත විධානයන් දෙක භාවිතා කළ හැකිය. නමුත් එම ක්රම දෙක එහි නොමැත. කෙසේ වෙතත්, ඔබට ක්රමයක් හරහා ප්රවේශ විය හැකි ලෙස ඔබට ගුණාංග වෙත පිවිසිය හැකිය attr_accessor
!! එබැවින් වචනයattr_accessor
. ගුණාංගය. ප්රවේශය. එය ඔබ ක්රමයකට ප්රවේශ වනවා වැනි ගුණාංග වලට ප්රවේශ වේ.
එකතු කිරීම attr_accessor :balance, :owner
මඟින් ඔබට කියවීමට හා ලිවීමට balance
සහ owner
"ක්රමය" ලබා ගත හැකිය. දැන් ඔබට අවසාන ක්රම 2 භාවිතා කළ හැකිය.
$ bankie.balance
$ bankie.owner
මෙම මොඩියුලය සඳහා නම් කරන ලද ලක්ෂණයක් අර්ථ දක්වයි, එහිදී නම symbol.id2name, නිදර්ශන විචල්යයක් (@ name) සහ එය කියවීමට අනුරූප ප්රවේශ ක්රමයක් නිර්මාණය කරයි. ගුණාංගය සැකසීමට name = නමින් ක්රමයක් ද සාදයි.
module Mod
attr_accessor(:one, :two)
end
Mod.instance_methods.sort #=> [:one, :one=, :two, :two=]
ආරෝපණ ප්රවේශකය සාරාංශ කිරීමට aka attr_accessor ඔබට නොමිලේ ක්රම දෙකක් ලබා දෙයි.
ජාවාහි මෙන් ඔවුන් ද ලබා ගන්නන් සහ සෙටර්ස් ලෙස හැඳින්වේ.
බොහෝ පිළිතුරු හොඳ උදාහරණ පෙන්වා ඇති නිසා මම කෙටියෙන් කියමි.
#the_attribute
සහ
# the_attribute =
පැරණි රූබි ලේඛනයේ හැෂ් ටැගය # යන්නෙන් අදහස් කරන්නේ ක්රමයකි. එයට පන්ති නාම උපසර්ගයක් ද ඇතුළත් විය හැකිය ... MyClass # my_method
මම රූබිට අලුත් කෙනෙක් වන අතර පහත සඳහන් අමුතුකම තේරුම් ගැනීම සමඟ කටයුතු කිරීමට මට සිදු විය. අනාගතයේදී වෙනත් කෙනෙකුට උදව් කළ හැකිය. අවසානයේදී එය ඉහත සඳහන් කළ පරිදි, ශ්රිත 2 ක් (def myvar, def myvar =) යන දෙකම @myvar වෙත ප්රවේශ වීම සඳහා ව්යංගයෙන් ලබා ගනී, නමුත් මෙම ක්රම දේශීය ප්රකාශ මගින් අභිබවා යා හැකිය.
class Foo
attr_accessor 'myvar'
def initialize
@myvar = "A"
myvar = "B"
puts @myvar # A
puts myvar # B - myvar declared above overrides myvar method
end
def test
puts @myvar # A
puts myvar # A - coming from myvar accessor
myvar = "C" # local myvar overrides accessor
puts @myvar # A
puts myvar # C
send "myvar=", "E" # not running "myvar =", but instead calls setter for @myvar
puts @myvar # E
puts myvar # C
end
end
ගුණාංග යනු වස්තුවෙන් පිටත සිට ප්රවේශ විය හැකි පන්ති සංරචක වේ. ඒවා වෙනත් බොහෝ ක්රමලේඛන භාෂාවල ගුණාංග ලෙස හැඳින්වේ. Object_name.attribute_name හි මෙන් "තිත් අංකනය" භාවිතා කිරීමෙන් ඒවායේ අගයන් ප්රවේශ කළ හැකිය. පයිතන් සහ වෙනත් භාෂා කිහිපයක් මෙන් නොව, රූබි විසින් නිදර්ශන විචල්යයන් වස්තුවෙන් පිටත සිට කෙලින්ම ප්රවේශ වීමට ඉඩ නොදේ.
class Car
def initialize
@wheels = 4 # This is an instance variable
end
end
c = Car.new
c.wheels # Output: NoMethodError: undefined method `wheels' for #<Car:0x00000000d43500>
ඉහත උදාහරණයේ දී, c යනු කාර් පන්තියේ උදාහරණයක් (වස්තුවකි). වස්තුවෙන් පිටත සිට රෝද නිදර්ශන විචල්යයේ වටිනාකම කියවීමට අපි අසාර්ථක උත්සාහයක් ගත්තෙමු. සිදුවූ දෙය නම් රූබි සී වස්තුව තුළ රෝද නම් ක්රමයක් හැඳින්වීමට උත්සාහ කළ නමුත් එවැනි ක්රමයක් නිර්වචනය කර නැත. කෙටියෙන් කිවහොත්, object_name.attribute_name වස්තුව තුළ attribute_name නම් ක්රමයක් ඇමතීමට උත්සාහ කරයි. රෝද විචල්යයේ අගයට පිටතින් ප්රවේශ වීම සඳහා, අපි එම නමින් නිදර්ශන ක්රමයක් ක්රියාත්මක කළ යුතු අතර, එමඟින් එම විචල්යයේ අගය නැවත කැඳවනු ලැබේ. එය ප්රවේශ ක්රමයක් ලෙස හැඳින්වේ. සාමාන්ය ක්රමලේඛන සන්දර්භය තුළ, වස්තුවෙන් පිටත සිට නිදර්ශන විචල්යයකට ප්රවේශ විය හැකි සාමාන්ය ක්රමය වන්නේ ප්රවේශක ක්රම ක්රියාත්මක කිරීමයි.
පහත දැක්වෙන උදාහරණයේ දී, අපි වස්තුවට පිටතින් රෝද විචල්යයට ප්රවේශ වීම සඳහා කාර් පන්තියට ගැටර් සහ සෙටර් ක්රම එකතු කර ඇත්තෙමු. මෙය ලබා ගන්නන් සහ කට්ටල අර්ථ දැක්වීමේ "රූබි ක්රමය" නොවේ; එය සේවය කරන්නේ ගෙටරය සහ සැකසුම් ක්රම කරන්නේ කුමක්ද යන්න නිදර්ශනය කිරීමට පමණි.
class Car
def wheels # getter method
@wheels
end
def wheels=(val) # setter method
@wheels = val
end
end
f = Car.new
f.wheels = 4 # The setter method was invoked
f.wheels # The getter method was invoked
# Output: => 4
ඉහත උදාහරණය ක්රියා කරන අතර ඒ හා සමාන කේත වෙනත් භාෂාවලින් ලබා ගන්නා සහ සැකසීමේ ක්රම නිර්මාණය කිරීමට බහුලව භාවිතා වේ. කෙසේ වෙතත්, රූබි මෙය සිදු කිරීම සඳහා වඩාත් සරල ක්රමයක් සපයයි: attr_reader, attr_writer සහ attr_acessor නමින් සාදන ලද ක්රම තුනක්. Attr_reader ක්රමය මඟින් උදාහරණ විචල්යයක් පිටතින් කියවිය හැකි වන අතර attr_writer එය ලිවිය හැකි වන අතර attr_acessor එය කියවිය හැකි සහ ලිවිය හැකි කරයි.
ඉහත උදාහරණය මේ ආකාරයට නැවත ලිවිය හැකිය.
class Car
attr_accessor :wheels
end
f = Car.new
f.wheels = 4
f.wheels # Output: => 4
ඉහත උදාහරණයේ දී, රෝදවල ගුණාංගය කියවිය හැකි අතර වස්තුවෙන් පිටත සිට ලිවිය හැකිය. Attr_accessor වෙනුවට, අපි attr_reader භාවිතා කළහොත් එය කියවීමට පමණි. අපි attr_writer භාවිතා කළේ නම්, එය ලිවීමට පමණි. එම ක්රම තුන තමන් තුළම ලබා ගන්නන් සහ සැකසුම් කරන්නන් නොව, ඔවුන් කැඳවූ විට, ඔවුන් අප වෙනුවෙන් ලබා ගන්නන් සහ සැකසුම් ක්රම නිර්මාණය කරයි. ඒවා ගතිකව (ක්රමලේඛිකව) වෙනත් ක්රම ජනනය කරන ක්රම වේ; එය metaprogramming ලෙස හැඳින්වේ.
පළමු (දිගු) උදාහරණය, රූබීගේ බිල්ට් ක්රම භාවිතා නොකරන අතර, භාවිතා කළ යුත්තේ ලබා ගන්නා සහ සැකසුම් ක්රමවල අතිරේක කේත අවශ්ය වූ විට පමණි. නිදසුනක් ලෙස, නිදර්ශන විචල්යයකට අගයක් පැවරීමට පෙර, සැකසුම් ක්රමයකට දත්ත වලංගු කිරීම හෝ යම් ගණනය කිරීමක් කිරීමට අවශ්ය විය හැකිය.
Instance_variable_get සහ instance_variable_set බිල්ට් ක්රම භාවිතා කිරීමෙන් වස්තුවෙන් පිටත සිට නිදර්ශන විචල්යයන්ට ප්රවේශ විය හැකිය (කියවීම සහ ලිවීම). කෙසේ වෙතත්, මෙය කලාතුරකින් යුක්ති සහගත වන අතර සාමාන්යයෙන් නරක අදහසක් වනු ඇත, මන්දයත් සංසරණය මඟ හැරීම සියලු ආකාරයේ විනාශයන් විනාශ කිරීමට හේතු වේ.
හ්ම්ම්. හොඳ පිළිතුරු ගොඩක්. මෙන්න මගේ ශත කිහිපයක්.
attr_accessor
පිරිසිදු කිරීමට අපට උපකාරී වන සරල ක්රමයකි (පුනරාවර්තනgetter and setter
ක්රම DRY-ing ) .
එවිට අපට ව්යාපාර තර්කනය ලිවීම කෙරෙහි වැඩි අවධානයක් යොමු කළ හැකි අතර, සැකසෙන්නන් සහ ලබා ගන්නන් ගැන කරදර නොවන්න.
අනෙක් ඒවාට වඩා attr_accessor හි ප්රධාන ක්රියාකාරිත්වය වන්නේ වෙනත් ලිපිගොනු වලින් දත්ත ප්රවේශ කිරීමේ හැකියාවයි.
එබැවින් ඔබට සාමාන්යයෙන් attr_reader හෝ attr_writer තිබිය හැකි නමුත් ශුභාරංචිය නම් රූබි ඔබට මේ දෙක attr_accessor සමඟ ඒකාබද්ධ කිරීමට ඉඩ ලබා දීමයි. එය වඩාත් හොඳින් වටකුරු හෝ බහුකාර්ය බැවින් එය මගේ යා යුතු ක්රමය ලෙස මම සිතමි . එසේම, රේල්ස් වලදී මෙය ඉවත් කරනු ලබන්නේ පසුපස කෙළවරේ එය ඔබ වෙනුවෙන් කරන බැවිනි. එබැවින් වෙනත් වචන වලින් කිවහොත්: ඔබ විශේෂිත දෙයට වඩා කරදර විය යුතු නැති නිසා අනෙක් දෙකට වඩා attr_acessor භාවිතා කිරීම වඩා හොඳය, පිවිසුම්කරු ඒ සියල්ල ආවරණය කරයි. මෙය සාමාන්ය පැහැදිලි කිරීමක් බව මම දනිමි නමුත් එය ආරම්භකයකු ලෙස මට උපකාරී විය.
මෙය උපකාරී වේ යැයි සිතමු!