Godot: GDScriptでのオプションの入力

䜜成日 2017幎08月25日  Â·  38コメント  Â·  ゜ヌス: godotengine/godot

これが必芁なのか、開発者にずっお興味深いものなのかはわかりたせんが、GDScriptでオプションの入力を行うず䟿利な堎合があり、ここでそれに぀いお話し合うこずを望んでいたした。

「Nim」ず呌ばれるプログラミング蚀語を孊んでいたす。GDNative甚の非垞に䜿いやすいモゞュヌルがあり、そこで貢献するこずを孊ぶこずに興味がありたすC ++は芖芚的に難しいので、これずは無関係ですが、背景がいく぀かありたす。 Nimは静的に型付けされおおり、GDSCriptは動的であるこずがわかっおいたすが、簡単にするために型を指定したいずいう状況に遭遇したした。

䞻に関数を䜜成するずきに、枡されるこずが蚱可されおいる倉数の型を指定しお、コヌド補完で私が話しおいるこずを認識できるようにするず䟿利ですが、他にも利点があるず確信しおいたす。これ。

䜕かのようなもの

func myfunction(a, b : int, c : InputEvent , d : String = "Default Value"):
    (...)

aが動的である堎合、bdは静的ですが、構文がどのように芋えるかを瀺しおいたす。

exportキヌワヌドを䜿甚するずきに゚ディタヌの型ヒントを指定できるこずは知っおいたすが、スクリプトの実行埌に倉数をその型に保぀必芁はありたせん。 このアむデアは、GDScriptの意図に反する可胜性がありたす。たたは、䜜業が倚すぎおほずんど利益が埗られない可胜性がありたすが、話をしたしょう。

discussion feature proposal gdscript

最も参考になるコメント

これはGodot3.1で利甚できるはずです。

党おのコメント38件

あなたができるように芋えたす

func myfunction(something = InputEvent):

䜕も枡さない堎合は空の入力むベントが発生したすが、倉数がそのタむプになるように匷制するこずはありたせん

myfunction('string')

うたくいくでしょう。

ロヌドマップ䞊にありたす:)
https://github.com/godotengine/roadmap/blob/master/ROADMAP.md

@Hinsbart
それがどのように芋えるか、たたはGDScriptの他の郚分でどのように機胜するかに぀いおの参照はありたすか それずも、ロヌドマップ䞊の単なるアむデアですか

残念ながら、いや、いく぀かのircの議論を陀いお、ただそれに぀いおの参照はありたせん。

CC @reduz 、圌がこれに぀いお䜕を考えおいるかに぀いおのいく぀かのヒントを䞎えるために。

@ LeonardMeagher2は、あなたが曞いたもののように芋えるはずです

どうですか

func myfunction(something is InputEvent, something_else is String):

それは私にずっおかなり良いこずであり、isキヌワヌドがより䟿利になり、コヌドが理解しやすくなりたす

同意したせん。 String somethingたたはsomething : Stringどちらでも倧䞈倫です。 something is Stringは私には悪いようです。

String somethingたたはsomething is Stringどちらも問題ありたせん。 コロンを䜿甚するず、コヌド内に倚くのコロン蚘号が䜜成されるず思いたす。

isが䜿甚されない堎合、私は他の蚀語からのこの衚蚘法に慣れおおり、より䞀般的だず思うので、 String somethingを奜みたす。

@neikeq
var something:String = " "ように、倉数を䜜成するずきにタむプを宣蚀できれば、同意したす

そうでなければ、関数定矩だけでセミコロンを䜿甚する方が混乱するだろうず思いたす。

「Is」は珟圚gdscriptの継承に぀いお尋ねるために䜿甚されおいたすが、なぜそれを芁求できなかったのでしょうか。

CのようなタむプのプレフィックスはIMOの方が優れおいたす。 これは短く、入力が速く、型を䜿甚するずきにvarたたはfuncを眮き換えるこずができたす。

䟋

int some_variable

int some_function(int some_argument):
    return some_variable + some_argument

それに察する私の投祚。

@ juan-garcia-m
タむピングのようにcに慣れおいない人にずっおは理解しやすいずは思いたせん。 入力する方が簡単かもしれたせんが、読みにくくなるず思いたす。
関数たたは倉数ずは䜕かを䞀目で知るこずを奜みたす。これらのキヌワヌドを型に眮き換えるず、その機胜が削陀されたす。 これが、CずC ++が入りにくい理由の1぀です。

蚀うたでもなく、私のために蚀語を䜜るこずはできたせんが、私だけがこのように感じおいるわけではないず確信しおいたす。

「is」の問題の1぀は、珟圚3.0で、以前は「extends」であったもの、぀たりノヌドがクラスに属しおいるかどうかを確認するために䜿甚されおいるこずです。

@ Zireael07
そのため、関数宣蚀で型をチェックするのが適切だず思いたす。
スクリプトの先頭では匕き続きExtendsが䜿甚されたすが、型チェックには「is」が䜿甚されたすリテラルの堎合はtypeofだず思いたす。

Cスタむルのプレフィックスは䞀般にもっず耇雑であり、これらのタむプの蚀語の堎合、暙準は倉数タむプの芏則であるように思われるため、これが䜿甚されたす。

なぜこれが閉鎖されたのですか それはただ実装されおいたせん...

ただの話し合いだったので閉じたしたが、再開しお目的の機胜の進捗状況を远跡したす

Cスタむルのプレフィックスが再考されるこずを本圓に望んでいたす。 Typescriptでの経隓から、倉数を初期化するずきの生産性が䜎䞋し、個人的にはコヌドが読みにくくなるず感じおいたす。 これを曞かなければならない...

var foo: String = 'bar'

... varキヌワヌドをタむプに眮き換えるだけでなく...

String foo = 'bar'

...私を狂わせたす。 これは非垞に小さくお぀たらないように聞こえたすが、ゲヌムでの長期的な䜜業では、必芁以䞊のキヌストロヌクが発生したす。

倖芳は次のずおりです。
godot windows tools 64_2017-12-12_17-21-27

Python構文に埓いたすTypeScriptやHaxeにも䌌おいたす。

これはかなり意芋が分かれおいたす。 たずえば、私はたくさんのTypeScriptコヌドを曞き、構文が本圓に奜きです。 タブずスペヌスのように、誰もが䜕が最善かに぀いお独自の意芋を持ち、通垞は背景に関連しおいたす。 Stringを芋お、それが関数なのか倉数なのかわからないよりも、 varを芋お、それが倉数であるこずを知っおいる方が簡単だず思いたす。 「タむプするのが速い」ずいうのは良い議論ではないず思いたす。「間違いを犯しにくい」ず「読みやすい」の方がはるかに優れおいたすただし、ただ意芋がありたす。

Pythonの方法のもう1぀のポむントは、解析がはるかに簡単なこずです。 珟圚のパヌサヌは、これに察応するために倧幅に倉曎する必芁はありたせん。 接頭蟞付きのタむプの堎合、䜕をするかを決定するために、コンテキストに぀いおさらに倚くのこずを考慮する必芁がありたす。

ええ、コヌドの可読性は非垞に䞻芳的です。 Cスタむルの構文でどのように芋えるかを䟋に曞き盎したした。 _I_以䞋のコヌドが読みやすく、倉数ず関数を区別するのに問題はありたせん。

extends Node

const int MY_CONSTANT = 0
String my_member_variable = "Value"

void my_empty_func():
    pass

float my_other_func(bool arg1, Node2D arg2, bool default = false):
    Vector2 local_variable
    int other_variable = 0

    return float(other_variable)

「入力が速い」ずいうのは、開発者の生産性に盎接圱響するため、良い議論ではないこずに同意する必芁がありたす。 Pythonスタむルは、Cのスタむルよりも読み取りず曞き蟌みが少し面倒なので、戻り型を定矩するためだけに->ず入力する必芁がありたす。 Pythonスタむルの構文に぀いお私が芋るこずができる唯䞀の匕数は、1。Pythonに粟通しおいる人にもっずアピヌルするこず、および2.実装が簡単であり、どちらも特に良い匕数ではないず思いたす。 実装が簡単だず蚀っおいるわけではありたせん。もっず難しく、おそらく私のスキルレベルを超えおいるず思いたすが、長期的にはそれだけの䟡倀があるず思いたす。

ずにかく、それは私の2ペニヌの䟡倀です smile:。 私はこれたでGDScriptでの開発を楜しんでおり、サりンドタむプシステムを備えおいるこずを楜しみにしおいたす。

Pythonはすでにこれをサポヌトしおいるので、私たちにできる最善のこずはそこからコピヌするこずだず思いたす

varキヌワヌドが嫌いな人のために、このようなものを蚱可するNimのような構文を远加するこずが可胜かもしれたせん。

  a:int
  b:float
  c:char

const
  PI:float = 3.1416
  MAX:int = 100

なぜリタヌンタむプが必芁なのか疑問に思いたす。リタヌンしおいお、その出力が特定のタむプの倉数に送られ、それらが䞀臎しない堎合は、スロヌされたす。
コヌドを実行する前に、線集者がその間違いを芋぀けるこずができるず思いたす。

リタヌンタむプvoidは私にはあたり意味がありたせん。その堎合は、リタヌンタむプの定矩を省略した方が簡単だず思いたす。

最埌に、 ->は、戻り型がある堎合は奇劙に思えたすが、 func somefunc(): String: 倚分のようなnimを実行しない可胜性がありたすが、私はそうではありたせん構文のような矢印のファンは、それも私にはあたり瀺さないので、方向性があるように芋えたすが、それずは䜕の関係もありたせん。ビット単䜍の挔算>>ず<<思い出させたすが、それらはある意味で方向性がありたす。

__問題を解決する぀もりはありたせんでした__

ノヌドのすべおの関数、その倉数、およびその戻り型を読み取るこずができるようになるため、堎合によっおは戻り型が重芁であるこずがわかっおいるこずがわかりたす。

今はあたり意味がないかもしれたせんが、人々はプラグむンや、それがどのように機胜するかを非垞に動的にするこずができるゲヌムコヌドを曞くこずができるようになりたす。 IEの堎合、プラグむンに次の譊告メッセヌゞが衚瀺される可胜性がありたす。「このノヌドにはx戻り型の関数が必芁ですが、参照しようずしおいるノヌドには、必芁なメ゜ッドシグネチャを持぀メ゜ッドがありたせん。」

私は、ナヌザヌフレンドリヌのためにSystem.Reflectionを介しおこのタむプのものをかなり䜿甚するAIBehaviorず呌ばれるUnityのプラグむンを䜜成したした。 私は文字通り、利甚可胜なメ゜ッド名を入力するドロップダりンメニュヌを持っおおり、正しい眲名を持぀すべおのメ゜ッドに基づいお、コヌルバックずしお䜿甚するメ゜ッドを遞択できるようにしたす。ゲヌムが実行されるず、そのメ゜ッドが呌び出されたす。それが䜜られた状況。 アクセスしようずしおいるオブゞェクト/スクリプトにメ゜ッドが存圚しない堎合は、むンスペクタヌにサンプルコヌドが衚瀺されるため、コヌドをコピヌしお貌り付け、クラスの名前を倉曎するだけでスクリプトを䜜成できたす。 :)

ですから、私の考えでは、できるだけ倚くのスクリプト情報を持぀こずができれば、Godotはプラグむン䜜成者にずっおはるかに拡匵性が高くなりたす。

たた、TypeScriptスタむルの構文 var name: String = "Godot" は、動的蚀語に远加されるオプションの型指定の暙準構文になっおいるため、望たしいず思いたす。

たた、Python構文に埓うこずをお勧めしたす。
https://www.python.org/dev/peps/pep-0484/
https://docs.python.org/3/library/typing.html

これは、オプションの入力を䜿甚しお、同様の動的蚀語からGDScriptにアクセスする人々を支揎したす。

ずころで、い぀/どのリリヌスでこれが実装されるず期埅できたすか 3.1が蚀及されおいるのを芋たこずがありたすか

これはGodot3.1で利甚できるはずです。

Cスタむルのプレフィックスがより耇雑で、理解しにくく、読みにくく、Python構文などを䜿甚する方が歓迎されるずいう議論に぀いお、すべおのドキュメントで、すべおのメ゜ッドなどでそのCスタむルのプレフィックスを䜿甚しおいるのではないでしょうか。 たずえば、カメラペヌゞから1぀をすばやく匕き出すだけで、 set_orthogonal ( float size, float z_near, float z_far )最初はよく理解できたせんでしたが、孊ぶのに少し時間がかかるだけで、その埌は完党に理にかなっおいたす。

こんにちは、ここで提案したす。

理論的根拠
静的型付けが必芁だず思いたすが、可胜であれば、ナヌザヌに型を指定するように匷制するこずは避けたす。
すべおの䞻芁なコンパむル蚀語は、静的型掚論に向かっおいたす。
@reduzは、Godot゜ヌスコヌドの型掚論があたり奜きではないこずを知っおいたす。明確な芳点から理解できたす。 ただし、この劥協案は、静的型チェックの利点のほずんどを備えおおり、コヌディング速床をそれほど劚げないため、GDScriptでは非垞にうたく機胜するず思いたす。
ただし、実装がより耇雑かどうかはわかりたせん。
これには、代数的デヌタ型ずしおいく぀かの远加のcostructが必芁になりたす。
これがこの原則を䜿甚する蚀語です

https://crystal-lang.org/docs/

䞋䜍互換性を維持するために、関数ず倉数を定矩するためにいく぀かの新しいキヌワヌドが必芁になりたす。 あるいは、静的型チェックを有効/無効にするための魔法のコメントがあるかもしれたせん。

これは、この皮の型システムで䜕ができるかの䟋です少しルビヌを知っおいる人のために

def test(x)
    return true if x
    return "This is false"
end

puts test(false).upcase
puts test(true)

出力

Error in test.cr:6: undefined method 'upcase' for Bool (compile-time type is (Bool | String))

puts test(false).upcase
                 ^~~~~~

考え

特にコヌド補完のためだけでなく、線集時に存圚しないプロパティ/メ゜ッドず無効な匕数カりントをチェックするためにも、型掚論を改善したいず思いたす。 オプションのタむピングが行われた埌の2番目のステップのこの郚分は、今のずころ気にしないでください。

@ m4nu3lfの䟋はかなり進んでおり、実際には分岐に基づいお結果の型を掚枬しおいたす。 コヌドの実行をシミュレヌトしないず、それがどのように行われるかがわかりたせん。コヌドは非垞に耇雑になる可胜性がありたす。 @reduzが䜿いたいのかわかりたせん。

Godotの型システムは非垞に厳密ですが、すべおの倉数はVariantです぀たり、任意の型を栌玍できたす。 これは互換性を損なうこずを意図しおいないので、それらはそのようにずどたらなければなりたせん。 したがっお、 var value = 42を実行しおも、倉数が敎数であるず自動的に想定されるこずはありたせん。特に、倖郚スクリプトによっお自由に蚭定できるクラスレベルの倉数の堎合はそうです。 それは、型掚論が䜕をするこずができるかずいう束を劚げたすしかし、完了の目的のためにこのように䜿甚するこずができたす。

前述のように、1぀の可胜性は、これをオプションにするこずです。 スクリプトごずにこれを有効/無効にするこずの䟡倀があたり芋られないので、おそらくプロゞェクト蚭定です。 それでも、それは次のステップで考えられる別の提案です。

@vnen理論的には、「auto」や「let」などのパラメヌタヌ/戻り型/倉数にいく぀かの新しいキヌワヌドを䜿甚し、crystal-langの同じアルゎリズムを䜿甚するこずで、コンパむル時に型を掚枬できたす。
これは、完党な型掚論を䜿甚した静的型付けです。
あなたが持っおいるずしたしょう
スクリプト内のauto my_field = 42は、タむプがintず単玔に掚枬し、基になるバリアントをintのみに制限するこずができたす。

ただし、その蚀語は単玔な倉数を超えおいたす。 ブランチに応じお、タむプをタむプのサブセットに制限できたす。
䞊蚘の䟋のように、戻り型は文字列たたはブヌル倀のみにするこずができたす。
しかし、これを行うには、

  • 匕数型の新しい組み合わせごずに関数をむンスタンス化し、各戻り匏の内郚型を掚枬し、可胜な戻り型のリストを戻り倀の型ずしお保存したす。
  • ブランチの堎合、倉数が割り圓おられおいる可胜性のあるすべおのブランチを調べお、特定の時間に倉数の可胜なすべおのタむプを掚枬したす。 い぀でも、バリアントのタむプをそれらに制限しおください

さらに、「むンスタンスの」条件などを確認する必芁がありたす。

if my_var instanceof MyClass:
...

次に、if条件の本䜓でmy_varは「MyClass」にしかできないため、型はさらに制限されおいるこずがわかりたす。
これに利点を持たせるには、可胜なすべおのタむプで名前が共有されおいるメ゜ッドを呌び出すか、フィヌルドにアクセスできる必芁がありたす。
だから蚀いたしょう

auto x = MyClass.new()
if (...):
   x = "hi"

この埌、xはMyClassたたはStringのいずれかになりたす。 実行時゚ラヌを回避するために、䞡方に共通のメ゜ッドのみを呌び出すこずができたす。

これは私が圓初考えおいたものよりもはるかに倚くの䜜業であるず私は蚀いたす。
だから私はこれに戻りたいず思いたす。 将来的に実装できるかもしれたせんし、誰かがcrystal-langのバむンディングを曞いおくれるこずを期埅できるかもしれたせん。
いずれにせよ、それは本圓にクヌルな機胜だず思いたす

@ m4nu3lf私はあなたの芁求が䜕であるかを理解しおいたす、TypeScriptは非垞に䌌おいたすこれは私がよりよく知っおいる蚀語です。

ただし、GDScriptに぀いお考慮すべきいく぀かの問題がありたす。

  • たず、それを実装するのは簡単ではありたせん。 他の蚀語がどのようにそれを実珟するかを芋るこずができたすが、それでも長い時間がかかりたす。 だから、䞀歩ず぀進んで、埌で考えたいず思いたす。 TypeScriptは、Turbo PascalずCを䜜成したのず同じ人によっお䜜成されたため、私にはない経隓がたくさんありたす。
  • GDScriptは䞀床に1぀のファむルをコンパむルしたす。 CrystalずTypeScriptはどちらも、プロゞェクトを䜿甚する前にプロゞェクト党䜓をコンパむルする必芁がありたす。 ぀たり、他のスクリプトやシングルトンずの盞互䜜甚をチェックするのは少し曇っおいたす。
  • シヌンツリヌ。 get_node() よく䜿甚されたすでは、どのノヌドタむプを取埗するかを知るこずは䞍可胜です。 あなたはそれがNodeであるこずを知っおいるだけですが、それはどんなサブタむプでもかたいたせん。 load()を呌び出すずき、特に動的な名前で呌び出す堎合は、リ゜ヌスにも同じこずが圓おはたりたす。 _input(event) eventは任意のInputEventサブタむプである可胜性があるため、 _input(event)にも同じ問題がありたす。
if my_var instanceof MyClass:
    ...

これは、コヌド補完のためにすでに掚枬されおいたす。 実際の型チェックに再利甚できたす。 特にこのケヌスは些现なこずですが、かなり耇雑になる可胜性がありたす。 たずえば、2番目の条件if some value == 42 and my_var is Spriteを远加するず、コヌド補完は機胜しなくなりたす。


たた、ナヌザヌからのフィヌドバックも聞きたいので、長い埅ち時間の埌にすべおを完璧にするよりも、すぐに利甚できるものを甚意するこずが私にずっお重芁です。

芁玄型掚論を改善したいのですが、少しず぀改善しお段階的に行う必芁がありたす。 オプションのタむピングが利甚可胜になるず、残りは困難になりたす。

なぜこれが閉鎖されおいるのですか

少し読み間違えたした、私の悪いです。

接頭蟞ず接尟蟞に戻るUMLずKotlinはどちらも「type」を䜿甚したす。
Basicも「DIMaasINT」を実行したした「」たたは「is」の代わりに「as」を䜿甚したした

@programathsそれから長い時間が経ち、䜕床も議論されおきたした。 さらに、postfixを実装するPRがあるので、今は少し問題倖ですsmiley

これを閉じる必芁がありたすか

@ LeonardMeagher2 PRがマヌゞされるず、自動的に閉じられたす。

@ bojidar-bgそれ自䜓が面癜いので、postfixが䜿甚される堎所をいく぀か远加したかっただけです。 UMLは、分析や技術者以倖の人も察象ずしおいたす。 Kotlinは、「効果的なJava」を実装しながら、Javaよりも快適でモダンになるように開発された蚀語です。

したがっお、postfixが遞択された理由を曞き留める必芁がある堎合は、これらも含めるこずができたす。 時々、人々はあなたがそれらをナヌザヌに関連付けない限り、理由を持ち、技術的なものを簡単に华䞋したいず思うでしょう。
䟋「パヌサヌはあいたいさを早期に解決でき、100倍の速床が埗られたす。぀たり、同じプログラムをより高速にコンパむルでき、より倚くのテストが可胜になりたす

玠材があるのはい぀もいいですね。 ;-)

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡