රූබි හි attr_accessor යනු කුමක්ද?


1033

මට රූබිattr_accessor ගැන තේරුම් ගැනීමට අපහසුය . යමෙකුට මෙය මට පැහැදිලි කළ හැකිද?



1
Attr_accessor Git හි මේ ආකාරයටම ක්‍රියා කරයිද? සමහර නිබන්ධන ප්‍රමාණවත් ලෙස පැහැදිලි නොකරන බවත් අනෙක් ඒවා පූර්ව දැනුම උපකල්පනය කරන බවත් මට පෙනී ගියේය.
ඇන්ජල්ෆිරෙන්ස්

10
Ng ඇන්ජල්ෆිරෙන්ස්, gitකිසිම සම්බන්ධයක් නැත attr_accessor. Git යනු අනුවාද පාලන මෘදුකාංගයක් වන අතර රූබිattr_accessor හි ක්‍රමයකි .
උස්බෙක්ජොන්

Answers:


2379

අපි ඔබට පන්තියක් ඇති බව කියමු 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_writerattr_accessor


47
k හකුනින් - එම පැහැදිලි පිළිතුරට ස්තූතියි. මට නැති වී ඇත්තේ රූබි සින්ටැක්ස් මගින් මහා බඩවැලක් යෝජනා කරන්නේ ඇයි ':' නිදසුනක් ලෙස attr_ * ප්‍රකාශයේ විචල්‍යයන් සඳහාද? විචල්‍යය වෙත යොමු කිරීම සඳහා පන්තියේ වෙනත් තැනක භාවිතා වන එකම '@' සින්ටැක්ස් භාවිතා කිරීම වඩාත් forward ජුව ඉදිරියට යන බව පෙනේ.
විල්

211
Ill විලියම් ස්මිත් ඔබේ ප්‍රශ්නයට පිළිතුරු සැපයීම සඳහා ඔබ එය තේරුම් ගත යුත්තේ attr_accessorඑය වර්තමාන පන්තියට කැඳවන ක්‍රමයක් වන අතර :nameඑය එම ක්‍රමයට ඔබ යොමු කරන පරාමිතියකි. එය විශේෂ වාක්‍ය ඛණ්ඩයක් නොවේ, එය සරල ක්‍රම ඇමතුමකි. ඔබ එයට @nameවිචල්‍යතාවයක් ලබා දෙන්නේ නම් , එය තේරුමක් නැත, මන්ද @name අඩංගු වේ nil. එබැවින් එය ලිවීම හා සමාන වනු ඇත attr_accessor nil. ඔබ එය නිර්මාණය කිරීමට අවශ්‍ය විචල්‍යයක් පසුකරන්නේ නැත, ඔබ විචල්‍යය හැඳින්වීමට අවශ්‍ය නම පසුකරමින් සිටී.
මැක්ස් චර්නියාක්

23
k හකුනින් - එය සම්පුර්ණයෙන්ම අර්ථවත් කරයි. මම අද ඉගෙන ගෙන ඇත්තේ රූබී ඇත්ත වශයෙන්ම 'ධාවනය' වන්නේ එය ගොනුවක් හරහා විග්‍රහ කරන විට බවත් සෑම ප්‍රකාශයක්ම සහ ප්‍රකාශනයක්ම ඇත්ත වශයෙන්ම කිසියම් වස්තුවක් සඳහා වන ඇමතුමක් බවත්ය. Attr_accessor ඇතුළුව. ඉතා ප්රයෝජනවත්.
විල්

53
අවුරුදු 3 ක් තිස්සේ රේල්ස් පාවිච්චි කළා, කවදාවත් මේක දැනගෙන හිටියේ නැහැ. ලැජ්ජාව
ෂෝන් ෂියාඕ

5
Um බුමින්ඩා ඔව්, නමුත් ක්‍රමය nameසහ විචල්‍යය @nameඑකම දෙයක් නොවේ. ඒවා පටලවා නොගන්න. @nameඔබේ පන්තියේ නිදර්ශන විචල්‍යයක් ඇති අතර attr_reader :nameඑය පිටතින් කියවිය හැකි යැයි ඔබ අර්ථ දක්වයි . තොරව attr_readerඔබට ප්රවේශ විය හැකි සරල ක්රමයක් පවතින @nameඔබගේ පන්තියේ පිටත.
මැක්ස් චර්නියාක්

127

attr_accessor යනු ක්‍රමයක් පමණි . (සබැඳිය එය ක්‍රියාත්මක වන ආකාරය පිළිබඳ වැඩි අවබෝධයක් ලබා දිය යුතුය - ජනනය කරන ලද ක්‍රම යුගල දෙස බලන්න, නිබන්ධනයක් මඟින් එය භාවිතා කරන ආකාරය පෙන්වයි.)

මෙම තේමාව තමයි classවන්නේ එය නිර්වචනය රූබි දී (එය C ++, සහ ජාවා වැනි භාෂා "පමණක් අර්ථ දැක්වීම" වන), නමුත් එය අපේ ඇගයීමට බව ප්රකාශ . මෙම ඇගයීම අතරතුරදී attr_accessorක්‍රමය ක්‍රියාත්මක කරන විට එය වත්මන් පන්තිය වෙනස් කරයි - ව්‍යංග ග්‍රාහකය මතක තබා ගන්න : self.attr_accessor,self මෙම අවස්ථාවෙහිදී “විවෘත” පන්ති වස්තුව ?

attr_accessorමිතුරන්ගේ අවශ්‍යතාවය , හොඳයි:

  1. ස්මාල්ටෝක් වැනි රූබි, එම වස්තුව සඳහා ක්‍රම 1 ට පිටතින් නිදර්ශන විචල්‍යයන්ට ප්‍රවේශ වීමට ඉඩ නොදේ . එනම් x.y, ජාවා හෝ පයිතන් වැනි සුලභව දක්නට ලැබෙන ආකාරයට නිදර්ශන විචල්‍යයන්ට ප්‍රවේශ විය නොහැක . රූබි yහි සෑම විටම යැවීමට පණිවිඩයක් ලෙස ගනු ලැබේ (හෝ "ඇමතීමේ ක්‍රමය"). මේ අනුව attr_*ක්‍රම මඟින් @variableගතිකව නිර්මාණය කරන ලද ක්‍රම හරහා නිදර්ශන ප්‍රවේශය ප්‍රොක්සි කරන ආවරණ නිර්මාණය කරයි.

  2. බොයිලර් ප්ලේට් උරා ගනී

මෙය කුඩා විස්තර කිහිපයක් පැහැදිලි කරයි යැයි සිතමු. සතුටු කේතීකරණය.


[1] මෙය තදින්ම සත්‍ය නොවන අතර මේ වටා සමහර “ශිල්පීය ක්‍රම” ඇත , නමුත් “පොදු නිදර්ශන විචල්‍ය” ප්‍රවේශය සඳහා සින්ටැක්ස් සහාය නොමැත.


ඔබ attr_accessor යනු “ක්‍රමයක්” යැයි පැවසූ විට මට එය ලැබුණි. නමුත් කිරීම සඳහා භාවිතා කරන කාරක රීති දේ කතා බව ක්රමය නමින්? Some_method: name => "any" ,: notherName ,: etc වැනි සින්ටැක්ස් ගැන කතා කරන රූබි ප්‍රලේඛනයේ කොටස සොයා ගැනීමට මට ගැටලුවක් තිබේ
බීටී

70

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

3
වඩාත්ම ආරම්භක මට්ටමේ අවස්ථා වලදී පවා මෙටප්‍රොග්‍රැමිං භාවිතා කරන බවට මෙය හොඳ උදාහරණයකි. ඉතා කදිමයි.
ජෝන් සයිමන්

2
මම ක්‍රියාත්මක කිරීමේ සටහනක් සොයමින් සිටි අතර attr_accessorඅවසානයේ මෙහි හමු විය! එය මගේ ගැටලුව විසඳුවද, (පොත් / නිල ලේඛනය) මට මෙවැනි ක්‍රියාත්මක කිරීමේ උදාහරණයක් සොයාගත හැක්කේ කොහෙන්දැයි දැන ගැනීමට මට කුතුහලයක් තිබේද?
වාසිෆ් හුසේන්

40

attr_accessor ඉතා සරලයි:

attr_accessor :foo

සඳහා කෙටිමඟකි:

def foo=(val)
  @foo = val
end

def foo
  @foo
end

එය වෙනත් දෙයක් නොවේ


10
ඔබේ පිළිතුර හොඳයි. 'කෙටිමං' යන්නෙහි අර්ථය මගේ ශබ්ද කෝෂයට අනුව "කෙටි විකල්ප මාර්ගයක්" මිස "සින්ටැක්ස් සීනි" හෝ "පරිවර්ථකයා විසින් අර්ථකථනය කරන ලද සාර්ව" නොවේ.
bowsersenior

25

මූලික වශයෙන් ඒවා රූබි සතුව නැති ප්‍රසිද්ධියේ ප්‍රවේශ විය හැකි දත්ත ගුණාංග ව්‍යාජ ය.


4
මෙම ප්‍රකාශය මුළුමනින්ම ප්‍රයෝජනවත් නොවූවත් එය සත්‍යයකි. රූබි හි "ලබා ගන්න" ක්‍රම වලින් බැහැරව පොදු දත්ත ගුණාංග නොපවතින බව අවධාරණය කරයි, එය භාෂාව ඉගෙන ගැනීමට උත්සාහ කරන කෙනෙකුට සැබවින්ම ප්‍රයෝජනවත් තොරතුරු වේ.
එරික් ඩෑන්ඩ්

3
මෙය සැබවින්ම අවතක්සේරු නොකළ යුතුය. රූබී නොවන අයෙකු ලෙස මේ දේවල් තේරුම් ගැනීමට උත්සාහ කරන විට, මෙම පිළිතුර ඉතා ප්‍රයෝජනවත් වේ!
බ්‍රැඩ්

1
එකඟයි, සී # ගේ නමට බෙහෙවින් සමාන බව පෙනේ {ලබා ගන්න; set;}
ඩේවිඩ් මිලර්

18

එය නිදර්ශන විචල්‍යයන් සඳහා ගෙටර් සහ සෙටර් ක්‍රම නිර්වචනය කරන ක්‍රමයක් පමණි. උදාහරණයක් ලෙස ක්‍රියාත්මක කිරීම:

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

මේ ආකාරයෙන් බහු ගුණාංග හැසිරවීම විශිෂ්ටයි!
වාසිෆ් හුසේන්

මෙටප්‍රෝග්‍රැමිං සම්බන්ධව මා සතුව තිබූ තවත් ප්‍රශ්නයක් විසඳීමට මෙය සැබවින්ම ප්‍රයෝජනවත් කේත ස්නිපටයක් විය.
alexventuraio

15

ඔබ 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"

2
පරිපූර්ණ පැහැදිලි කිරීමක්! එය ඉතා හුරුබුහුටි හැසිරීමක් වන අතර එය ඉතා පහසුවෙන් අභිබවා යා හැකිය.
රුබයිඩර්

15

කිසිදු කේතයක් නොමැතිව සරල පැහැදිලි කිරීම

ඉහත පිළිතුරු බොහොමයක් කේත භාවිතා කරයි. මෙම පැහැදිලි කිරීම ප්‍රතිසමයක් / කතාවක් හරහා කිසිවක් භාවිතා නොකර එයට පිළිතුරු දීමට උත්සාහ කරයි:

බාහිර පාර්ශවයන්ට අභ්‍යන්තර සීඅයිඒ රහස් වෙත පිවිසිය නොහැක

  • සැබවින්ම රහසිගත ස්ථානයක් ගැන සිතමු: සීඅයිඒ. සීඅයිඒ තුළ සිටින පුද්ගලයින් හැර සීඅයිඒ හි සිදුවන්නේ කුමක්දැයි කිසිවෙකු දන්නේ නැත. වෙනත් වචන වලින් කිවහොත්, බාහිර පුද්ගලයින්ට සීඅයිඒ හි කිසිදු තොරතුරකට ප්‍රවේශ විය නොහැක. නමුත් සම්පූර්ණයෙන්ම රහසිගත සංවිධානයක් තිබීම හොඳ නැති නිසා, ඇතැම් තොරතුරු බාහිර ලෝකයට ලබා දී ඇත - සීඅයිඒ ආයතනය සැබවින්ම සැවොම දැන ගැනීමට කැමති දේවල් පමණි: උදා: සීඅයිඒ අධ්‍යක්ෂ, මෙම දෙපාර්තමේන්තුව කෙතරම් පරිසර හිතකාමීද යන්න අනෙකුත් සියලුම රජයේ දෙපාර්තමේන්තු වෙත යනාදිය. වෙනත් තොරතුරු: උදා: ඉරාකයේ හෝ ඇෆ්ගනිස්ථානයේ එහි රහසිගත ක්‍රියාකාරීන් කවුරුන්ද - මේ ආකාරයේ දේවල් ඉදිරි වසර 150 සඳහා රහසක්ව පවතිනු ඇත.

  • ඔබ සීඅයිඒ වෙතින් පිටත නම් ඔබට ප්‍රවේශ විය හැක්කේ එය මහජනයාට ලබා දී ඇති තොරතුරු පමණි. නැතහොත් සීඅයිඒ උපභාෂාව භාවිතා කිරීමට ඔබට ප්‍රවේශ විය හැක්කේ “නිෂ්කාශනය” කළ තොරතුරු පමණි.

  • සීඅයිඒ ආයතනයෙන් පිටත සාමාන්‍ය ජනතාවට ලබා දීමට සීඅයිඒට අවශ්‍ය තොරතුරු හැඳින්වෙන්නේ: ගුණාංග.

කියවීමේ හා ලිවීමේ ගුණාංගවල තේරුම:

  • සීඅයිඒ සම්බන්ධයෙන් ගත් කල, බොහෝ ගුණාංග "කියවීමට පමණි". මෙයින් අදහස් කරන්නේ ඔබ සීඅයිඒ වෙතින් බාහිර පක්ෂයක් නම් , ඔබට ඇසිය හැකිය : "සීඅයිඒ හි අධ්‍යක්ෂ කවුද?" එවිට ඔබට answer ජු පිළිතුරක් ලැබෙනු ඇත. "කියවීමට පමණි" ගුණාංග සමඟ ඔබට කළ නොහැකි දෙය නම් සීඅයිඒ හි වෙනස්කම් සිදු කිරීමයි. ඔබට දුරකථන ඇමතුමක් හදිසියේ නොහැකි උදා තීරණය ඔබ කිම් Kardashian අධ්යක්ෂ, හෝ ඔබ පැරිස් හිල්ටන් සේනාධිනායකයා වීමට අවශ්ය බව අවශ්ය බව.

  • ගුණාංග ඔබට "ලිවීමට" ප්‍රවේශය ලබා දුන්නේ නම්, ඔබට අවශ්‍ය නම්, ඔබ පිටත සිටියත් ඔබට වෙනස්කම් කළ හැකිය. එසේ නොමැතිනම් ඔබට කළ හැකි එකම දෙය කියවීම පමණි.

    වෙනත් වචන වලින් කිවහොත්, ප්‍රවේශයන් කියවීමට හෝ ලිවීමට ප්‍රවේශ වන්නන් මත පදනම්ව බාහිර පුද්ගලයින්ට ඇතුළුවීමට ඉඩ නොදෙන සංවිධාන වෙත විමසීම් කිරීමට හෝ වෙනස්කම් කිරීමට ප්‍රවේශයන් ඔබට ඉඩ දෙයි.

පංතියක් තුළ ඇති වස්තූන් පහසුවෙන් එකිනෙකාට ප්‍රවේශ විය හැකිය

  • අනෙක් අතට, ඔබ දැනටමත් සිටියා නම් සීඅයිඒ තුළ කාබුල්හි ඔබේ සීඅයිඒ ක්‍රියාකාරිකයා පහසුවෙන් ඇමතිය හැකිය, මන්ද ඔබ දැනටමත් ඇතුළේ සිටින බැවින් මෙම තොරතුරු පහසුවෙන් ලබා ගත හැකිය. නමුත් ඔබ සීඅයිඒ වෙතින් පිටත නම්, ඔබට ප්‍රවේශය ලබා නොදෙනු ඇත: ඔවුන් කවුරුන්දැයි ඔබට දැන ගැනීමට නොහැකි වනු ඇත (ප්‍රවේශය කියවන්න), සහ ඔවුන්ගේ මෙහෙවර වෙනස් කිරීමට ඔබට නොහැකි වනු ඇත (ලිවීමේ ප්‍රවේශය).

පංති සමඟ එකම දේ සහ ඒවා තුළ විචල්යයන්, ගුණාංග සහ ක්රම වලට ප්රවේශ වීමට ඇති හැකියාව. HTH! ඕනෑම ප්රශ්නයක්, කරුණාකර විමසන්න, මට පැහැදිලි කර ගත හැකි යැයි මම බලාපොරොත්තු වෙමි.


ඔබේ පැහැදිලි කිරීම අර්ථවත් කරයි! +1 කණගාටුයි, "සීඅයිඒ විසින් නිෂ්කාශනය කරන ලද තොරතුරු නිවැරදි බව ඔබට විශ්වාසද?
kouty

සීඅයිඒ හි විවිධ "නිෂ්කාශන" මට්ටම් තිබේ: උදා: ඉහළ රහස (ප්‍රෙස් හැර වෙන කිසිවෙකු) හෝ මහජන විශ්වාසය (සෑම කෙනෙකුටම එම තොරතුරු කියවිය හැකිය). සීඅයිඒ ඇත්ත වශයෙන්ම ඉතා සිසිල් කරුණු රාශියක් සපයයි!
BKSpurgeon

පැරිස් හිල්ටන්ගේ කාර්ඩාෂියන් උදාහරණ සඳහා ඔබ සුදුසුයි :) මම හිතුවේ ට්‍රම්ප් ජනාධිපතිට වඩා නරක යැයි කියාය, භාරව සිටින දෙදෙනා මවා ගන්න!
rmcsharry

ඔව්! අපට අවශ්‍ය වන්නේ එයයි, කේතයකින් තොරව StackOverflow! :-)
මර්වින්

12

මමත් මෙම ගැටලුවට මුහුණ දුන් අතර මෙම ප්‍රශ්නයට තරමක් දීර් 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 යන දෙකෙහිම කාර්යයන් ඉටු කරයි, ඔබට තවත් කේත පේළියක් ඉතිරි කරයි.


10

මම හිතන්නේ නව රුබීවාදීන් / ක්‍රමලේඛකයින් (මා වැනි) ව්‍යාකූල කරන දෙයින් කොටසක්:

"එයට කිසියම් ලක්ෂණයක් (උදා: නම) ඇති බව මට පැවසිය නොහැක්කේ ඇයි? එම ගුණාංගයට එකවරම වටිනාකමක් ලබා දිය හැකිද?"

තව ටිකක් සාමාන්‍යකරණය කර ඇත, නමුත් මෙය මා සඳහා ක්ලික් කළ ආකාරය මෙයයි:

ලබා දී ඇත්තේ:

class Person
end

පුද්ගලයා සඳහා නමක් හෝ වෙනත් ගුණාංග තිබිය හැකි දෙයක් ලෙස අපි අර්ථ දක්වා නැත .

ඉතින් අපි එසේ නම්:

baby = Person.new

... ඔවුන්ට නමක් දීමට උත්සාහ කරන්න ...

baby.name = "Ruth"

අපට දෝෂයක් ඇති වන්නේ, රුබිලන්ඩ්හි, පුද්ගල පන්තියේ වස්තුවක් "නමක්" සමඟ සම්බන්ධ වී ඇති හෝ හැකියාවක් ඇති දෙයක් නොවන නිසාය ... තවමත්!

නමුත් අපට ලබා දී ඇති ඕනෑම ක්‍රමයක් (පෙර පිළිතුරු බලන්න) කීමට ක්‍රමයක් ලෙස භාවිතා කළ හැකිය, “පුද්ගල පන්තියක ( baby) දැන් උදාහරණයක් ලෙස 'නම' යනුවෙන් ගුණාංගයක් තිබිය , එබැවින් අපට ලබා ගත හැකි සින්ටැක්ටිකල් ක්‍රමයක් පමණක් නොව එම නම සැකසීම, නමුත් අපට එය කිරීම අර්ථවත් කරයි.

නැවතත්, මෙම ප්‍රශ්නයට තරමක් වෙනස් හා සාමාන්‍ය කෝණයකින් පහර දීම, නමුත් මෙම ත්‍රෙඩ් එකට යන මාර්ගය සොයා ගන්නා පන්තියේ පුද්ගලයාගේ ඊළඟ අවස්ථාව සඳහා මෙය උපකාරී වනු ඇතැයි මම බලාපොරොත්තු වෙමි.


6

සරලව කිවහොත් එය පන්තිය සඳහා කට්ටලයක් සහ ලබා ගන්නෙකු අර්ථ දක්වනු ඇත.

එය සටහන් කර ගන්න

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 

පංතිය සඳහා කට්ටලයක් සහ ලබා ගන්නෙකු නිර්වචනය කිරීමට සමාන වේ.


5

නිශ්චිත ගුණාංග සඳහා සරලවම සහ ක්‍රම attr-accessorනිර්මාණය කරයිgettersetter


5

එය වටහා ගත හැකි තවත් ක්‍රමයක් නම්, එය තිබීමෙන් ඉවත් කරන්නේ කුමන දෝෂ කේතයද 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

2

මෙම මොඩියුලය සඳහා නම් කරන ලද ලක්ෂණයක් අර්ථ දක්වයි, එහිදී නම symbol.id2name, නිදර්ශන විචල්‍යයක් (@ name) සහ එය කියවීමට අනුරූප ප්‍රවේශ ක්‍රමයක් නිර්මාණය කරයි. ගුණාංගය සැකසීමට name = නමින් ක්‍රමයක් ද සාදයි.

module Mod
  attr_accessor(:one, :two)
end
Mod.instance_methods.sort   #=> [:one, :one=, :two, :two=]

1

ආරෝපණ ප්‍රවේශකය සාරාංශ කිරීමට aka attr_accessor ඔබට නොමිලේ ක්‍රම දෙකක් ලබා දෙයි.

ජාවාහි මෙන් ඔවුන් ද ලබා ගන්නන් සහ සෙටර්ස් ලෙස හැඳින්වේ.

බොහෝ පිළිතුරු හොඳ උදාහරණ පෙන්වා ඇති නිසා මම කෙටියෙන් කියමි.

#the_attribute

සහ

# the_attribute =

පැරණි රූබි ලේඛනයේ හැෂ් ටැගය # යන්නෙන් අදහස් කරන්නේ ක්‍රමයකි. එයට පන්ති නාම උපසර්ගයක් ද ඇතුළත් විය හැකිය ... MyClass # my_method


1

මම රූබිට අලුත් කෙනෙක් වන අතර පහත සඳහන් අමුතුකම තේරුම් ගැනීම සමඟ කටයුතු කිරීමට මට සිදු විය. අනාගතයේදී වෙනත් කෙනෙකුට උදව් කළ හැකිය. අවසානයේදී එය ඉහත සඳහන් කළ පරිදි, ශ්‍රිත 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

0

ගුණාංග සහ ප්‍රවේශ ක්‍රම

ගුණාංග යනු වස්තුවෙන් පිටත සිට ප්‍රවේශ විය හැකි පන්ති සංරචක වේ. ඒවා වෙනත් බොහෝ ක්‍රමලේඛන භාෂාවල ගුණාංග ලෙස හැඳින්වේ. 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 බිල්ට් ක්‍රම භාවිතා කිරීමෙන් වස්තුවෙන් පිටත සිට නිදර්ශන විචල්‍යයන්ට ප්‍රවේශ විය හැකිය (කියවීම සහ ලිවීම). කෙසේ වෙතත්, මෙය කලාතුරකින් යුක්ති සහගත වන අතර සාමාන්‍යයෙන් නරක අදහසක් වනු ඇත, මන්දයත් සංසරණය මඟ හැරීම සියලු ආකාරයේ විනාශයන් විනාශ කිරීමට හේතු වේ.


-2

හ්ම්ම්. හොඳ පිළිතුරු ගොඩක්. මෙන්න මගේ ශත කිහිපයක්.

  • attr_accessor පිරිසිදු කිරීමට අපට උපකාරී වන සරල ක්‍රමයකි (පුනරාවර්තනgetter and setter ක්‍රම DRY-ing ) .

  • එවිට අපට ව්‍යාපාර තර්කනය ලිවීම කෙරෙහි වැඩි අවධානයක් යොමු කළ හැකි අතර, සැකසෙන්නන් සහ ලබා ගන්නන් ගැන කරදර නොවන්න.


-3

අනෙක් ඒවාට වඩා attr_accessor හි ප්‍රධාන ක්‍රියාකාරිත්වය වන්නේ වෙනත් ලිපිගොනු වලින් දත්ත ප්‍රවේශ කිරීමේ හැකියාවයි.
එබැවින් ඔබට සාමාන්‍යයෙන් attr_reader හෝ attr_writer තිබිය හැකි නමුත් ශුභාරංචිය නම් රූබි ඔබට මේ දෙක attr_accessor සමඟ ඒකාබද්ධ කිරීමට ඉඩ ලබා දීමයි. එය වඩාත් හොඳින් වටකුරු හෝ බහුකාර්ය බැවින් එය මගේ යා යුතු ක්‍රමය ලෙස මම සිතමි . එසේම, රේල්ස් වලදී මෙය ඉවත් කරනු ලබන්නේ පසුපස කෙළවරේ එය ඔබ වෙනුවෙන් කරන බැවිනි. එබැවින් වෙනත් වචන වලින් කිවහොත්: ඔබ විශේෂිත දෙයට වඩා කරදර විය යුතු නැති නිසා අනෙක් දෙකට වඩා attr_acessor භාවිතා කිරීම වඩා හොඳය, පිවිසුම්කරු ඒ සියල්ල ආවරණය කරයි. මෙය සාමාන්‍ය පැහැදිලි කිරීමක් බව මම දනිමි නමුත් එය ආරම්භකයකු ලෙස මට උපකාරී විය.

මෙය උපකාරී වේ යැයි සිතමු!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.