Question about the intended semantics for inline `#:` type assertions on local variables
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
- Tipo di issue
- Documentazione
- Chiarezza
- Da chiarire
- Stato di attività
- Tranquilla
- Stack tecnologico
- ruby
- Ambito
- documentation
Direzione di ricerca
Inizia esaminando la documentazione della sintassi inline in docs/ e i comportamenti segnalati di Steep e Sorbet per le asserzioni sulle variabili locali. Confronta gli esempi nell’issue e determina se il progetto debba specificare un’unica semantica o documentare le differenze tra i checker. Il lavoro è concluso quando è disponibile una decisione documentata o una modifica alla documentazione chiaramente circoscritta per gli autori e gli utenti degli strumenti.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Now that inline RBS comments are in ruby/rbs I'd like to clarify what the #: type assertion on a local variable is supposed to mean and to make sure that we aren't baking in a semantic difference between steep and sorbet.
For instance in the following code:
x = "hi" #: String
x = 5
- Steep (verified on
2.0.0) treats#:as a type assertion on the expression (introduced in Steep 1.3 as "declaring the type of an expression inline, without introducing a new local variable with a@type varannotation"). The local remains flow-typed, so the laterx = 5re-infersxtoInteger— no error at the reassignment. - Sorbet (verified on
0.6.13327(RBS comments support) lowersx = v #: Ttox = T.let(v, T).T.letdeclares the local's type for the whole method scope, sox = 5is an error ("Incompatible assignment to variable declared vialet").
This is extra confusing because in the case of
class Foo
attr_accessor :bar #: String?
end
foo = Foo.new
Foo.bar = 5
results in an error in both Steep and Sorbet.
Questions
- Is the semantics of a
#:assertion on a local variable intended to be an expression-level assertion (Steep's behavior), a scope-level declaration/pin (Sorbet'sT.letbehavior), or is it deliberately left to each checker? - If it's left to checkers by design, can we consider documenting that (e.g. in
docs/) so tool authors and users know portability is not guaranteed here? - If a single intended meaning is desired, is there a preference — and would it be worth a note in the inline-syntax docs so Steep/Sorbet/other implementations (RubyMine, and third-party checkers) can converge?
- Lingua principale
- Ruby
- Stelle
- 2.2k
- Fork
- 256
- Merge medio
- 7g 1h
- PR unite (30g)
- 35
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di ruby/rbs
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 35/100
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
TheOdinProject/curriculum#31417 · 2 commenti ·
-
Allow faraday-http-cache 3.x Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
glossarist/glossarist-ruby#238 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
palladius/rails8-app-on-gcp#145 ·