Peki, Ruby içerik oluşturucuları neden symbols
dilde kavramını kullanmak zorunda kaldı ?
Tamamen “yapmak zorunda değiller”, seçtiler. Ayrıca, kesinlikle konuşmanın Symbol
dilin bir parçası olmadığını, çekirdek kütüphanenin bir parçası olduğunu unutmayın . Onlar do dil düzeyinde değişmez sözdizimini var, ancak arayarak bunları inşa etmek olsaydı onlar sadece de çalışmak Symbol::new
.
Bunu anlamaya çalışan yakut olmayan bir programcının bakış açısından soruyorum. Başka birçok dil öğrendim ve hiçbirinde Ruby'nin dediği şeyle ilgilenip ilgilenmediğimi belirtmem gerekmedi symbols
.
Bu "diğer birçok dillerin" ne olduğunu söylemediniz, ama işte Symbol
Ruby'nin veri tipine sahip küçük bir dil alıntısı :
- ECMAScript , ayrıca JavaScript
- Scala
- Şema , Ortak Lisp , Clojure (ayrıca, Clojure'un anahtar kelimeleri vardır ), temelde Lisp ailesindeki her dil, halefleri ve kuzenleri bunlara sahiptir
- Smalltalk , Newspeak ve Smalltalk ailesindeki (Ruby'nin onları nereden aldığı büyük olasılıkla), Objective-C (sınırlı da olsa)
- Erlang ( atom adı verilir ) , ayrıca İksir ve LFE
- Julia
- Prolog ( atom adı verilir ), bu da Erlang'ın onları aldığı yer
Ayrıca Symbol
s'nin özelliklerini farklı bir biçimde sağlayan başka diller de vardır . Örneğin Java'da Ruby'nin özelliklerinin özellikleri String
iki (aslında üç) türe ayrılır: String
ve StringBuilder
/ StringBuffer
. Öte yandan, Ruby'nin özellikleri Symbol
türü Java içine katlanır String
tip: Java String
ler edilebilir enterne , edebi dizeleri ve String
değerlendirilir sabit ifadeler otomatik olarak enterne edilmiştir derleme zamanında sonucudur ler, dinamik olarak oluşturulmuş String
ler arayarak staj edilebilir String.intern
yöntemi. String
Java'da bir stajyer , Symbol
Ruby'de olduğu gibi , ancak ayrı bir tür olarak uygulanmaz, bir Java'nınString
(Not: Ruby'nin önceki sürümlerinde, önceden String#to_sym
çağrılmıştı String#intern
ve bu yöntem bugün eski bir takma ad olarak varlığını sürdürüyor.)
Ana soru şu olabilir: symbols
Ruby'deki kavram, kendisi ve diğer diller üzerinde bir performans niyeti olarak var mı ,
Symbol
s her şeyden önce belirli semantiğe sahip bir veri tipidir . Bu semantik ayrıca bazı performans işlemlerinin (örneğin hızlı O (1) eşitlik testi) uygulanmasını mümkün kılar, ancak bu temel amaç değildir.
ya da sadece dilin yazılma şekli nedeniyle var olması gereken bir şey mi?
Symbol
Ruby dilinde hiç gerekli değildir, Ruby onlarsız iyi çalışır. Bunlar tamamen bir kütüphane özelliğidir. D'de Symbol
s'ye bağlı tam olarak bir yer vardır : bir def
yöntem tanımı ifadesi Symbol
, tanımlanmakta olan yöntemin adını göstererek değerlendirilir . Ancak, bu oldukça yeni bir değişikliktir, bundan önce dönüş değeri basitçe belirtilmemiş olarak bırakılmıştır. MRG basitçe değerlendirdi nil
, Rubinius bir Rubinius::CompiledMethod
nesneyi değerlendirdi, vs. Ayrıca bir UnboundMethod
… ya da sadece a'yı değerlendirmek de mümkün olacaktır String
.
Ruby'deki bir program, Python veya Node muadili olandan daha hafif ve / veya daha hızlı olur mu? Eğer öyleyse, bunun nedeni olabilir symbols
mi?
Burada ne istediğini bilmiyorum. Performans, dil değil, çoğunlukla uygulama kalitesi meselesidir. Ayrıca, Düğüm bir dil bile değil, ECMAScript için olaylı bir G / Ç çerçevesi. IronPython ve MRI'da eşdeğer bir komut dosyası çalıştıran IronPython'un daha hızlı olması muhtemeldir. CPython ve JRuby + Truffle'da eşdeğer bir komut dosyası çalıştıran JRuby + Truffle muhtemelen daha hızlı olacaktır. Bunun Symbol
s ile ilgisi yok ama uygulamanın kalitesi ile: JRuby + Truffle agresif bir şekilde optimize eden bir derleyiciye ve yüksek performanslı bir JVM'nin tüm optimizasyon makinelerine sahiptir, CPython basit bir yorumlayıcıdır.
Ruby'nin amacından biri insanlar için okunması ve yazılması kolay olduğundan, yaratıcıları bu geliştirmeleri yorumlayıcının kendisinde (diğer dillerde olduğu gibi) uygulayarak kodlama sürecini kolaylaştıramaz mı?
Hayır Symbol
. Derleyici optimizasyonu değildir. Belirli semantiğe sahip ayrı bir veri türüdür. YARV'nin s için özel bir iç optimizasyon olan flonumları gibi değiller Float
. Durum için aynı değildir Integer
, Bignum
ve Fixnum
, hangi olmalıdır görünmez bir özel iç optimizasyon detay, ama ne yazık ki değil. (Bu nihayet hangi kaldırır, Ruby 2.4 sabit olacak Fixnum
ve Bignum
sadece ve yapraklar Integer
.)
Java'nın bunu yaptığı gibi, normalin özel bir durumu olarak, bu özel durumda olup olmamaları ve hangi koşullarda otomatik olarak bu özel durumda String
olup olmadıkları konusunda her zaman dikkatli olmanız gerektiği anlamına gelir String
. Bu, ayrı bir veri tipine sahip olmaktan çok daha yüksek bir yüktür.
Sembollerin dile özgü olmayan bir tanımı ve diğer dillerde bulunması için bir neden var mı?
Symbol
ad veya etiket kavramını gösteren bir veri türüdür . Symbol
s değer nesneleridir , değişmezdir, genellikle derhal (dil böyle bir şeyi ayırt ederse), vatansızdır ve kimliği yoktur. Symbol
Eşit olan iki kişinin özdeş olduğu garanti edilir, diğer bir deyişle, Symbol
eşit olan iki s aslında aynıdır Symbol
. Bu, değer eşitliği ve referans eşitliğinin aynı şey olduğu ve dolayısıyla eşitliğin etkili olduğu ve O (1) anlamına gelir.
Onları bir dilde bulundurma nedenleri, dilden bağımsız olarak gerçekten aynıdır. Bazı diller onlara diğerlerinden daha fazla güvenir.
Örneğin Lisp ailesinde "değişken" kavramı yoktur. Bunun yerine, Symbol
değerlerle ilişkilendirilmişsinizdir.
Yansıtıcı veya özeleştirisel yeteneklere sahip dillerde, Symbol
s genellikle Ruby, yansıma API'leri örn yansıyan kişilerin isimlerini belirtmek için kullanılır Object#methods
, Object#singleton_methods
, Object#public_methods
, Object#protected_methods
, ve Object#public_methods
bir dönüş Array
içinde Symbol
(onlar sadece yanı bir geri dönebilirler rağmen s Array
arasında Method
s). Object#public_send
Bir sürer Symbol
(aynı zamanda kabul etse bir argüman olarak göndermek için mesajın adını gösteren String
, hem de Symbol
daha anlam doğrudur).
ECMAScript'e olarak, Symbol
s olan temel gelecekte ECMAScript yeteneği-kasa yapma yapı taşı. Ayrıca yansımada büyük rol oynarlar.