Hva gjør Ruby konstant bety?

stemmer
4

Hva gjør Ruby konstanter egentlig? Følgende kode viser ikke noen 'konstant' attributt. Advarselen er der, men jeg kommer til å endre hva A refererer til.

A = 1
puts A # => 1
A = 2  # warning: already initialized constant A
puts A # => 2

Eller er Ruby konstanter er bare en indikasjon uten håndheving?

Publisert på 29/12/2009 klokken 22:25
kilden bruker
På andre språk...                            


6 svar

stemmer
3

Det er riktig - å tildele til en konstant er en advarsel, ikke en feil, "Konstanter" er bare en indikator på hvordan du skal bruke noe, ikke en regel at du bruker det på den måten.

Det kan høres fryktelige som kommer fra en statisk-programmering verden, men det er utrolig nyttig i ulike metaprogramming fasiliteter, og det gjør at ting som ellers ville være helt umulig i statiske språk.

Når det er sagt, hvis du virkelig ønsker å sikre at folk holde sine skitne hender av referansene dine, kan du bruke Object#freeze. Det er fortsatt greit å endre hva en referansepunkter til med dette; du bare ikke kan endre innholdet i referansen selv:

irb(main):001:0> class Fruit; attr_accessor :name; end
=> nil
irb(main):002:0> f = Fruit.new
=> #<Fruit:0xb7e06570>
irb(main):003:0> f.name = "apple"
=> "apple"
irb(main):004:0> f.freeze                # After freeze, can't touch this Fruit.
=> #<Fruit:0xb7e06570 @name="apple">
irb(main):005:0> f.name = "banana"
TypeError: can't modify frozen object    # Kablammo!
    from (irb):5:in `name='
    from (irb):5

Men dette er i orden:

irb(main):006:0> f = Fruit.new
=> #<Fruit:0xb7dfed84>
irb(main):007:0> f.name = "banana"
=> "banana"
Svarte 29/12/2009 kl. 22:27
kilden bruker

stemmer
14

Det er riktig, konstanter er akkurat som variabler i ruby, men du får en advarsel hvis du endrer dem.

Det er også en forskjell med bare variabler: Du kan få tilgang til konstanter, selv om de er definert i en annen klasse eller modul, for eksempel gitt denne tekstutdrag:

module Constants
  PI = 3,1415
  other = "variable"
end

Du kan nå PIgjøre Constants::PImens Constants::othervil ikke fungere.

Svarte 29/12/2009 kl. 22:28
kilden bruker

stemmer
8

Ja, Ruby konstanter ikke håndheves, annet enn å skrive den advarselen.

Svarte 29/12/2009 kl. 22:28
kilden bruker

stemmer
2

"Konstant" er egentlig en misvisende benevnelse, det viktigste aspektet av Rubys "konstanter" er ikke deres uforanderlighet, men deres oppslags regler.

se: http://coderrr.wordpress.com/2008/03/11/constant-name-resolution-in-ruby/

Svarte 30/12/2009 kl. 03:09
kilden bruker

stemmer
0

Konstanter brukes til å lagre verdier som ikke bør endres. Deres navn må starte med en stor bokstav. Ved konvensjonen, er de fleste konstant navn skrevet i store bokstaver med en understrekning som ord separator, som SOME_CONSTANT.

Konstanter innenfor klassene kan nås av alle metoder for vedkommende klasse. De som er opprettet utenfor en klasse kan nås globalt (innenfor en hvilken som helst metode eller klasse).

class Car
  WHEELS = 4

  def initialize
    puts WHEELS
  end
end

c = Car.new     # Output: 4

Merk at Ruby ikke stoppe oss fra å endre verdien av en konstant, det bare utsteder en advarsel.

SOME_CONSTANT = "foo"
SOME_CONSTANT = "bar"
warning: already initialized constant SOME_CONSTANT
warning: previous definition of SOME_CONSTANT was here

I Ruby alle klasse- og modulnavn er konstanter, men konvensjonen tilsier at de bør være skrevet på kamel tilfelle, for eksempel SomeClass.

Konstanter kan nås fra utsiden av klasse, selv innenfor en annen klasse, ved hjelp av :: (dobbel colon) operatør. For å få tilgang hjulene konstant fra utenfor Car klassen, ville vi bruke Car :: HJUL. Den :: operatøren tillater konstanter, fellesforekomst metoder og klassen metoder for å nås fra utsiden av klassen eller modulen på hvilken de er definert.

En innebygd metode som kalles private_constant gjør konstanter privat (kun tilgjengelig i klassen som de ble opprettet). Syntaksen er som følger:

class Car
  WHEELS = 4

  private_constant:WHEELS
end

Car::WHEELS    # Output: NameError: private constant Car::WHEELS referenced
Svarte 26/06/2016 kl. 17:36
kilden bruker

stemmer
0

Hvis du kommer fra andre programmeringsspråk, håndterer Ruby konstanter annerledes enn hva du kanskje er vant til. Konstanter, generelt, ta verdier som ikke endres gjennom hele programmet. Syntaksen er å bruke store bokstaver mens navngi konstant, slik at programmet vet hvordan man skal håndtere det. For eksempel, for å sette en konstant å holde et baseball-lag du vil erklære det på denne måten:

TEAM = "Angels"

Jeg vet at du vet så mye, bære over med meg her. Vanligvis vil andre programmeringsspråk ikke tillate deg å endre verdien av TEAM. Men Ruby ikke holde deg tilbake og tar den siste verdien som er tildelt konstant. I eksempelet ovenfor, kan jeg endre verdien til:

TEAM = "Athletics"

Andre programmeringsspråk vil enten kaste en feil eller vil skrive ut verdien av Angels . Men, skriver Ruby verdi Friidrett fordi det er den siste verdien som er tilordnet variabel TEAM . Dessuten gir det en advarsel som sier at den konstante allerede initialisert og ble endret fordi endring konstant regnes som en dårlig programmering praksis. Men, likevel det kan du gjøre endringen og følger Ruby konvensjonen av tillitsfulle utvikleren å gjøre det riktige programmering avgjørelse. Så vær forsiktig når du bruker konstanter i Ruby, siden de kan overstyres.

Svarte 11/06/2018 kl. 11:55
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more