Belirleyiciler ve öznitelikler hakkında bilgi edin ve Verse koduna nasıl daha fazla semantik ve davranış uygulayacağını öğren.
Verse’te belirleyiciler, semantik ile ilgili davranışları açıklar ve tanımlayıcılar ile belirli anahtar sözcüklere belirleyiciler ekleyebilir. Belirleyici sözdizimi, anahtar sözcüğü açılı ayraçlar (< ve >) içinde alır. Örneğin, IsPuzzleSolved()<decides><transacts>:void içinde, "decides" ve "transacts" belirleyicilerdir.
Verse’te öznitelikler, Verse dilinin dışında kullanılan davranışı açıklar (Verse semantiğini açıklayan belirleyicilerin aksine). Öznitelik sözdizimi, @ karakterini, ardından anahtar sözcüğü kullanır. Örneğin: @editable.
Aşağıdaki bölümlerde Verse’te bulunan tüm belirleyiciler ve özniteliklerle birlikte bunları ne zaman kullanabileceğin açıklanır.
Bir fonksiyon tanımında () simgesinden sonra: name()<specifier>:type = codeblock.
class anahtar sözcüğü: name := class<specifier>(){}.
Belirleyici
Açıklama
Örnek
no_rollback
Özel bir efekt belirtilmediğinde varsayılan efekttir. no_rollback efekti, fonksiyon tarafından gerçekleştirilen hiçbir eylemin geri alınamayacağını, sonuç olarak da fonksiyonun bir başarısızlık bağlamında kullanılamayacağını belirtir. Bu efekt manuel olarak belirtilemez.
name():type = codeblock
transacts
<transacts> efekti, <allocates>, <reads> ve <writes> efektlerinin bir bileşimidir. <transacts> efekti bu belirleyicilerle birleştirilemez.
name()<transacts> : type = codeblock
# izin verilmez çünkü transacts reads’i ima eder
name()<transacts><reads>: type = codeblock
# izin verilmez çünkü transacts writes’ı ima eder
name()<transacts><writes>: type = codeblock
allocates
Bu efekt, fonksiyonun bellekte bir obje örneği oluşturabileceğini gösterir. Metot, başarısız olan bir başarısızlık bağlamında çağrılırsa efektler geri alınır.
name()<allocates> : type = codeblock
reads
Bu efekte sahip bir metot, değiştirilebilir durumdan okuma yapabilir.
name()<reads> : type = codeblock
writes
Bu efekte sahip bir metot, değiştirilebilir duruma yazabilir. Metot, başarısız olan bir başarısızlık bağlamında çağrılırsa efektler geri alınır.
name()<writes> : type = codeblock
computes
Bir <computes> metodu, belirtilen herhangi bir girdi için sonsuza kadar aynı çıktıyı döndürmeyi vaat eder. Bir <computes> metodu, <transacts>, <reads>, <writes> veya <allocates> olamaz.
name()<computes>
converges
Bu efekt, ilgili fonksiyonun yürütülmesinden kaynaklanan bir yan etki olmamasının yanında fonksiyonun tamamlanmasını (sonsuz kadar yinelenmemesini) garanti eder. Bu efekt yalnızca native belirleyicisine sahip fonksiyonlarda görünebilir ancak bunun gerçekleşmesi derleyici tarafından denetlenmez. Bu efektin gerçekleşmesi için sınıf alanlarının varsayılan değerlerini veya global değişkenlere dair değerleri sağlayan kod gereklidir.
name()<converges> : type = codeblock
decides
Bu efekt, fonksiyonun başarısız olabileceğini ve bu fonksiyonu çağırmanın başarısız olabilir bir ifade olduğunu belirtir. Bir <decides> fonksiyonu başarısız olabileceğinden, <suspends> efektiyle karşılıklı olarak birbirini dışlar. <decides> efektini, fonksiyonun herhangi bir yerinde başarısızlık olursa bu fonksiyon tarafından gerçekleştirilen eylemlerin (eylemler hiç gerçekleştirilmemiş gibi) geri alınmasına izin veren <transacts> veya <computes> efektiyle birleştirmek yararlı olabilir.
# izin verilir
name()<decides><transacts> : type = codeblock
# izin verilir
name()<decides><computes> : type = codeblock
# izin verilmez çünkü decides ve suspends birbirini dışlar
name()<decides><suspends> : type = codeblock
suspends
Bu efekt, fonksiyonun asenk. olduğunu gösterir. İşlev gövdesi için bir asenk. bağlamı oluşturur. <decides> efektiyle karşılıklı olarak birbirini dışlar.
name()<suspends> : type = codeblock
# izin verilmez çünkü decides ve suspends birbirini dışlar
name()<decides><suspends> : type = codeblock
Tüm durumlarda belirli bir efekte sahip bir işlevi çağırmak için çağıranın da o efekte sahip olması gerekir.
Erişim Belirleyicileri
Erişim belirleyiciler bir üye ile neyin nasıl etkileşimde bulunabileceğini tanımlar. Erişim belirticilerini aşağıdakilere uygulayabilirsin:
Bir üye için tanımlayıcı: name<specifier> : type = value
Bir üye için var anahtar sözcüğü: var<specifier> name : type = value
Kimlerin değişkene okuma ve yazma erişimi olduğunu ayırt etmek için bir değişkenin hem tanımlayıcı (identifier) hem de var anahtar sözcüğünde bir erişim belirticisi olabilir. Örneğin, aşağıdaki MyInteger değişkeninin tanımlayıcısında public (herkese açık) belirleyicisi olduğu için değeri herkes okuyabilir ancak var anahtar sözcüğü protected (korumalı) belirleyicisine sahip olduğundan yalnızca geçerli sınıf ve alt türler değişkene yazabilir.
Verse
var<protected> MyInteger<public>:int = 2
Belirleyici
Açıklama
Kullanım
Örnek
public
Tanımlayıcı genel erişime açıktır.
Bu belirleyiciyi şuralarda kullanabilirsin:
modül
sınıf
arayüz
yapı
enum
yöntem
veri
Verse
name<public> : type = value
protected
Tanımlayıcıya yalnızca geçerli sınıf ve alt türler tarafından erişilebilir.
Bu belirleyiciyi şuralarda kullanabilirsin:
sınıf
arayüz
yapı
bir sınıf içindeki fonksiyonlar
enum
modül olmayan yöntem
veri
Verse
name<protected> : type = value
private
Tanımlayıcıya yalnızca geçerli bir üst kapsam (modül, sınıf, yapı vb. olabilir) içinde erişilebilir.
Bu belirleyiciyi şuralarda kullanabilirsin:
sınıf
arayüz
yapı
bir sınıf içindeki fonksiyonlar
enum
modül olmayan yöntem
veri
Verse
name<private> : type = value
internal
Tanımlayıcıya yalnızca geçerli bir üst kapsam olan modülde erişilebilir. Bu, varsayılan erişim seviyesidir.
Bu belirleyiciyi şuralarda kullanabilirsin:
modül
sınıf
arayüz
yapı
enum
yöntem
veri
Verse
name<internal> : type = value
scoped
Tanımlayıcıya yalnızca geçerli kapsamda ve onu çevreleyen kapsamlardan erişilebilir. Verse’te kullanıma açtığın ve Assets.digest.Verse dosyasında görünen tüm öğeler <scoped> belirleyicisini içerir.
Bu belirleyiciyi şuralarda kullanabilirsin:
modül
sınıf
arayüz
fonksiyonlar
yapı
enum
modül olmayan yöntem
veri
Verse
# Enclosing scope for ModuleB and ModuleC.
ModuleA<public> := module:
ModuleB<public> := module:
# Internal to ModuleB.
class_b1 := class{}
# Allows access from anywhere inside ModuleA.
class_b2<scoped{ModuleA}> := class {}
Sınıf Belirleyicileri
Sınıf belirleyiciler, sınıfların veya üyelerinin, bir sınıfın alt sınıfını oluşturup oluşturamayacağın gibi belirli özelliklerini tanımlar.
Belirleyici
Açıklama
Örnek
abstract
Bir sınıf veya sınıf metodunda abstract belirleyicisi olduğunda sınıfın bir örneğini oluşturamazsın. Soyut sınıflar, kısmi uygulamalı bir üst sınıf veya ortak bir arayüz olarak kullanılmaya yöneliktir. Bu anlayış, bir üst sınıfın örneklerine sahip olmanın mantıklı olmadığı ancak özellikleri ve davranışları benzer sınıflar arasında tekrar etmek istemediğin durumlar için faydalıdır.
Bu türün dinamik olarak dönüştürülebilir olduğunu belirtir. <castable> belirleyicisinin kullanımında geriye doğru uyumluluk kısıtlaması vardır. Bir sınıf veya arayüz bir kez yayınlandıktan sonra <castable> özniteliği eklenemez veya kaldırılamaz. Bunu yapmak, güvenli olmayan dönüştürme davranışlarına neden olabileceğinden buna izin verilmez.
Castable_subtype türü, subtype ile çok benzer şekilde çalışır ancak onunla birlikte kullanılan tüm türlerin de <castable> olarak işaretlenmesini gerektirir. Bu, dinamik dönüştürmelerin kullanıldığı yerlerde kod güvenliğini artırır.
Bir sınıf concrete belirleyicisine sahip olduğunda boş bir arketiple sınıfın bir örneğini oluşturabilirsin. Dolayısıyla, sınıfın her alanı varsayılan bir değere sahip olmak zorundadır. Bir somut sınıfın her alt sınıfı örtük olarak somuttur. Bir somut sınıfın bir soyut sınıftan doğrudan devralabilmesi için her iki sınıfın da aynı modülde tanımlanmış olması gerekir.
Verse
cat := class<concrete>():
# field must be initialized because the class is concrete
Name : string = "Cat"
unique
Verse’te unique (benzersiz) bir sınıfa her örnek için bir benzersiz kimlik atanır. Buna göre, aynı benzersiz sınıfın iki örneği, aynı alan değerlerine sahip olsalar bile farklı örnekler oldukları için eşit değildir. Bu işlem, benzersiz sınıf örneklerinin, kimlikleri karşılaştırılmak suretiyle eşitlik açısından karşılaştırılmasına imkan tanır. Benzersiz belirleyicisi olmayan sınıfların böyle bir kimliği yoktur, dolayısıyla bunlar eşitlik açısından yalnızca alanlarının değerlerine göre karşılaştırılabilir. Buna göre, benzersiz sınıflar = ve <> işleçleriyle karşılaştırılabilir, ayrıca karşılaştırılabilir türün alt türleridir.
Verse
unique_class := class<unique>:
Field : int
Main()<decides> : void =
X := unique_class{Field := 1}
X = X # X is equal to itself
Y := unique_class{Field := 1}
X <> Y # X and Y are unique and therefore not equal
final
final belirleyicisini sınıflarda ve sınıf üyelerinde yalnızca aşağıdaki kısıtlamalar dahilinde kullanabilirsin:
Bir sınıf final belirleyicisine sahip olduğunda, sınıfın bir alt sınıfını oluşturamazsın.
Bir alan final belirleyicisine sahip olduğunda, alanı bir alt sınıfta geçersiz kılamazsın.
Bir yöntem `final` belirleyicisine sahip olduğunda yöntemi bir alt sınıfta geçersiz kılamazsın.
Verse
cat := class<final>():
final_super
final_super belirleyicisi yalnızca sınıf tanımları için geçerlidir ve sınıf tanımının bir üst sınıftan veya arayüzden türetilmesini gerektirir. Bu belirleyici, bu sınıf tanımının mevcut ve gelecekteki tüm yayınlanmış sürümleri için belirtilen sınıfın her zaman doğrudan üst sınıfından türeteceği bir gelecek uyumluluğu kısıtlaması uygular.
Scene Graph’ta bu, component ilk alt türleri için örnek sayısını Scene Graph varlığı başına tam olarak sıfır veya bir ile sınırlamak amacıyla gereklidir. Bu sınırlama, bu türlerin alt türlerini de kapsar.
Verse
component := class {}
my_final_class := class<final_super>(component) {}
# Not allowed since my_final_class has the final_super specifier.
my_subclass_type := class(my_final_class) {}
Süreklilik Belirleyicisi
Sınıf gibi özel bir türün <persistable> belirleyicisine sahip olması, bu sınıfı, modül kapsamına alınmış weak_map değişkenlerinde kullanabileceğin ve onun değerlerinin oyun oturumları genelinde kalıcı olmasını sağlayabileceğin anlamına gelir. Verse’te süreklilik hakkında daha fazla bilgi için Verse’te Özel Kalıcı Veriler Kullanmak kısmına göz atın.
Süreklilik belirleyicisini aşağıdaki türlerle kullanabilirsin. Daha fazla bilgi almak için bağlantıları izle.
Şu anda yalnızca enum’larla kullanılabilir. <open> ve <closed> belirleyicileri, adan yayınlandıktan sonra enum’ın tanımını nasıl değiştirebileceğini belirler.
Açık ve kapalı belirleyicileri aşağıdaki türlerle kullanabilirsin. Daha fazla bilgi almak için bağlantıları izle.
Şu anda yalnızca enum’lar için geçerli olan bir belirleyici.
Açık bir enum’da enum değerleri ekleyebilir veya onları yeniden sıralayabilir ya da enum’ı <closed> bir enum olarak değiştirebilirsin.
Açık enum’ların daha çok, enum’ındaki değer sayısının gelecekte artabileceğini düşündüğün zamanlarda kullanılması doğrudur. Örneğin, bir silah türleri enum’ı.
Verse
# Enums are <closed> by default so you must explicitly define the enum as an open enum with the <open> specifier
my_enum := enum<open>{Value1, Value2, Value3}
Kapalı
Şu anda yalnızca enum’lar için geçerli olan bir belirleyici.
Enum’lar varsayılan olarak kapalıdır.
Kapalı enum’ların daha çok, değerlerinin aynı kalmasının beklendiği durumlarda (haftanın günleri gibi) kullanılması doğrudur.
Verse
# Enums are <closed> by default so the specifier is not required.
my_enum := enum{Value1, Value2, Value3}
# You can also explicitly define the enum as closed by adding the <closed> specifier
my_enum := enum<closed>{Value1, Value2, Value3}
Uygulama Belirleyicileri
Kod yazarken uygulama belirleyicileri kullanmak mümkün değildir ancak UEFN API’lerine baktığında bunları göreceksin.
Belirleyici
Açıklama
Örnek
native
Öğenin tanım ayrıntılarının C++ dilinde uygulandığını belirtir. native belirleyicisine sahip Verse tanımları, C++ tanımlarını otomatik olarak oluşturur. Bir Verse geliştiricisi daha sonra bu tanımların uygulamasını doldurabilir. Bu belirleyicinin şuralarda kullanıldığını görebilirsin:
Bir örnek metodunun hem yerel (C++ dilinde uygulanan) olduğunu hem de diğer C++ kodlarıyla çağrılabileceğini belirtir. Bu belirleyicinin bir örnek yönteminde kullanıldığını görebilirsin. Bu belirleyici alt sınıflara yayılmaz, dolayısıyla bu belirleyiciye sahip bir yöntemi geçersiz kılarken bunu bir tanıma eklemen gerekmez
Verse’te öznitelikler, Verse dilinin dışında kullanılan davranışı açıklar (Verse semantiğini açıklayan belirleyicilerin aksine). Öznitelikler, kod satırında tanımların önüne eklenebilir.
Öznitelik sözdizimi, @ işaretini takip eden anahtar sözcüğü kullanır.
Öznitelik
Açıklama
Örnek
editable
Bu alanın doğrudan UEFN’den değiştirilebilen kullanıma sunulmuş bir özellik olduğunu, bu nedenle değerini değiştirmek için Verse kodunu değiştirmenin gerekli olmadığını belirtir. Daha fazla bilgi için Cihaz Özelliklerini Özelleştirme sayfasına bakabilirsin.
Editörde metin kutusu olarak gösterilen düzenlenebilir bir dize. Düzenlenebilir metin kutuları şu anda araç ipuçlarını veya kategorileri desteklemiyor.
Daha fazla bilgi için Cihaz Özelliklerini Özelleştirme sayfasına bakabilirsin.
Verse
# An editable string that displays as a text box in the editor.
# Editable text boxes currently do not support tooltips or categories.
@editable_text_box:
# Whether this text can span multiple lines.
MultiLine := true
# The maximum amount of characters this text block can display.
MaxLength := 32
MessageBox:string = "This is a short message!"
editable_slider
Kayan sayı türünü kullanan düzenlenebilir bir kaydırıcı. Değeri artırmak veya azaltmak için editörde kaydırıcıyı sürükleyebilirsin.
Daha fazla bilgi için Cihaz Özelliklerini Özelleştirme sayfasına bakabilirsin.
Verse
# An editable slider that uses the float type. You can drag the slider in the editor to increase
# or decrease the value.
@editable_slider(float):
# The categories this editable belongs to.
Categories := array{FloatsCategory}
# The tool tip for this editable.
ToolTip := SliderTip
# The minimum value of each component. You cannot set an editable value for this number lower
editable_number
Minimum ve maksimum değerleri olan düzenlenebilir bir sayı.
Daha fazla bilgi için Cihaz Özelliklerini Özelleştirme sayfasına bakabilirsin.
Verse
# An editable number with minimum and maximum
@editable_number(int):
# The tool tip for this editable.
ToolTip := EditableIntTip
# The category this editable belongs to.
Categories := array{IntsCategory}
# The minimum value of each component. You cannot set an editable value for this number lower
editable_vector_slider
Düzenlenebilir vektör kaydırıcısı. Her bir vektör bileşeninin değerini sürükleyerek değiştirebilirsin.
Daha fazla bilgi için Cihaz Özelliklerini Özelleştirme sayfasına bakabilirsin.
Verse
# An editable vector slider. You can drag to change the values of each of the vector components.
@editable_vector_slider(float):
# The tool tip for this editable.
ToolTip := VectorSliderTip
# The categories this editable belongs to.
Categories := array{FloatsCategory}
# Shows the option to preserve the ratio between vector values in the editor.
ShowPreserveRatio := true
editable_vector_number
vector2, vector2i veya vector3 olabilecek, düzenlenebilir vektör numarası.
Daha fazla bilgi için Cihaz Özelliklerini Özelleştirme sayfasına bakabilirsin.
Verse
# An editable vector number, which can be a vector2, vector2i, or vector3.
@editable_vector_number(float):
# The categories this editable belongs to.
Categories := array{FloatsCategory}
# The tool tip for this editable.
ToolTip := VectorFloatTip
# Shows the option to preserve the ratio between vector values in the editor.
editable_container
Düzenlenebilir değer kapsayıcısı. Şu anda bu özellik yalnızca dizileri destekliyor.
Daha fazla bilgi için Cihaz Özelliklerini Özelleştirme sayfasına bakabilirsin.
Verse
An editable container of values. Currently, this only supports arrays.
@editable_container:
# The category this editable belongs to.
Categories := array{IntsCategory}
# The tool tip for this editable.
ToolTip := IntArrayTip
# Whether dragging elements to reorder this container is allowed.