Julia: requireを削陀し、むンポヌトし、堎合によっおはimportallを削陀しお、䜿甚にマヌゞしたす

䜜成日 2014幎08月14日  Â·  72コメント  Â·  ゜ヌス: JuliaLang/julia

メヌリングリストから

ステファン

茞入を完党に廃止し、

Fooを䜿甚する
Fooを䜿甚するbar

1぀目は、Fooのバむンディングをロヌドしお䜜成し、その゚クスポヌトを「゜フト」バむンディングずしお䜿甚できるようにしたす珟圚の䜿甚方法。 2぀目は、Fooのバむンディングをロヌドしお䜜成し、バヌを「ハヌド」バむンディングずしお䜿甚できるようにしたすむンポヌトが珟圚行うこず。

これはただ新参者にずっおかなり混乱しおいるようです。

breaking design modules speculative

最も参考になるコメント

importずexportの察称性が奜きです。 誰かがどこかで指摘したように。

党おのコメント72件

import Foo機胜もどういうわけか必芁です。ここでは、 Fooだけを取埗し、他には䜕もありたせん。

using Foo: 

using Foo: Foo 

FooをFooモゞュヌルにバむンドするには他には䜕もありたせん
import Foo
FooをモゞュヌルFooにバむンドするには、 xをFoo.xにバむンドし、 yをFoo.yにバむンドしたす
import Foo: x, y
FooをモゞュヌルFooにバむンドし、Fooの゚クスポヌトされたすべおの名前を修食せずにバむンドするには
import Foo: *

代わりにusingになる可胜性がありたすが、これはimportの粟神に基づいおいるように感じたす。

これにより、スコヌプ内に䜕かを持ち蟌むこずず、メ゜ッド拡匵に䜿甚できるようにするこずの違いもなくなりたす。 個人的にはそれは良いこずだず思いたすし、モゞュヌルシステムをより理解しやすくしたすが、私はそれを確実に立ち䞊げたかったのです。

モゞュヌルの゚クスポヌトされたすべおのバむンディングを䜿甚可胜にするコンストラクトは、ハヌド importall バむンディングではなく、゜フト using バむンディングにする必芁があるずいう匷いケヌスがありたす。 モゞュヌルAがモゞュヌルBを䜿甚し、 foo(::Any)を定矩するずしたす。 モゞュヌルBの今埌のリリヌスでも、 foo(::Any)が定矩および゚クスポヌトされる堎合は、それらが盞互に競合するこずは望たしくありたせん。 たた、モゞュヌルBがfoo(::Int)を定矩し、モゞュヌルAが定矩したメ゜ッドの代わりにそのメ゜ッドを呌び出す堎合がありたす。これは、モゞュヌルBがより具䜓的であるため、たたはモゞュヌルBから必芁なすべおの識別子をリストする必芁があるためです。単䞀の競合する識別子のむンポヌトを回避するため。

ただし、むンポヌトする識別子を明瀺的にリストしおいる堎合は、゜フトバむンディングを指定する理由はありたせん。 識別子の新しいメ゜ッドを定矩しない堎合ハヌドバむンディングず゜フトバむンディングの動䜜は同じ、たたは新しいメ゜ッドを定矩する堎合゜フトバむンディングはバむンディングなしず同等であり、必芁に応じおその動䜜では、リストから識別子を削陀する必芁がありたす。

぀たり、 @StefanKarpinskiの提案が奜きです。 抂念的には、ハヌドバむンディングず゜フトバむンディングの䞡方が必芁ですが、1぀のキヌワヌドですべおの有甚な動䜜を取埗できたす。

あなたの蚀っおる事がわかりたす。 その堎合、 using Foo: コロンはあるがアむテムはないは抂念的に䞀貫しおいるように芋えるずいうあなたの提案が奜きです。 コロンは、プルするシンボルを制限するこずを瀺しおいたすが、リストしおいたせん。

空の末尟の:は少しおかしいように芋えたすが、人々はそれに慣れるず思いたす

空の末尟のコロンの問題は、珟圚、次の行で名前を怜玢しおいるこずです。぀たり、 using Foo:は䞍完党であるず芋なされたす。

関連4600

珟圚のゞュリアの慣習は、すべおをにむンポヌトするこずであるこずを私は知っおいたす
珟圚のモゞュヌルの名前空間ですが、ただあるはずだず本圓に思いたす
モゞュヌルの名前だけをむンポヌトする簡単で自然な方法です。

たた、FooずFoo.Barを䜿甚した堎合の珟圚のオヌバヌロヌドは
問題がある; Fooの内郚に芋えたすが、Foo.Barの内郚には芋えたせんFoo.Barが
モゞュヌル

ステファンの提案では、これは次のように察凊されおいるず思いたす

Fooの䜿甚Foo

2014幎8月14日朚曜日、 toivohnotifications @github.comは次のように曞いおいたす。

珟圚のゞュリアの慣習は、すべおをにむンポヌトするこずであるこずを私は知っおいたす
珟圚のモゞュヌルの名前空間ですが、ただあるはずだず本圓に思いたす
モゞュヌルの名前だけをむンポヌトする簡単で自然な方法です。

たた、FooずFoo.Barを䜿甚した堎合の珟圚のオヌバヌロヌドは
問題がある; Fooの内郚に芋えたすが、Foo.Barの内郚には芋えたせんFoo.Barが
モゞュヌル

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/JuliaLang/julia/issues/8000#issuecomment-52202142 。

@kmsquireですが、Fooモゞュヌル内にFooモゞュヌルがある堎合はどうなりたすか 残念ながら、それはあいたいです。

これは蚭蚈゚ラヌですそしお譊告が発生したすので、問題ではありたせん

@ssfrrが提案したバヌゞョンが䞀番奜きです。

パッケヌゞにはモゞュヌル゚ントリポむントが1぀しかないずいう基本的な芏則はありたすか -- import Fooは、パッケヌゞFooのモゞュヌルFooをむンポヌトするこずを意味したす。 その他のモゞュヌルは、 Fooのサブモゞュヌルである必芁がありたす。 これは、パッケヌゞFoo、パッケヌゞ内のFoo.jlずパッケヌゞ内のmodule Fooの間に暗黙の察応があるこずを意味したす。

importをロヌカル/盞察むンポヌトにも䜿甚できるかどうか疑問に思っおいたす。 プロゞェクトにsrc/foo.jlずsrc/bar.jlがあり、 foo.jlあるずしたす。

import bar

src/bar.jlからむンポヌトしたす。 これは、モゞュヌルシステム内で動䜜するため、 includeを䜿甚するよりも改善されおいたす。

はい、パッケヌゞ、パッケヌゞ゚ントリポむント、およびモゞュヌルは1察1であるこずが期埅されおいたす。 必芁に応じおこの芏則を砎るこずができたすが、モゞュヌルは名前を付けるためだけのものであり、機胜ナニットではないため、それほど必芁はありたせん。 import barが絶察むンポヌトであるのに察し、盞察むンポヌトの構文がimport .barであるこずを陀いお、あなたが提起しおいるアむデアは4600です。

@StefanKarpinski import .barは実際にロヌカルディレクトリで「bar.jl」を怜玢したすか import .Barは、すでに珟圚の芪モゞュヌルのサブモゞュヌルのみを参照しおいるずいう印象を受けたした。

曎新ええず、それはあなたが4600で提案するものです。 ごめん。

+1:。 これを行う堎合は、0.4が適切なタむミングです。

+1先に進んで、これのいく぀かをクリヌンアップしおください0.4の堎合

拡匵するかどうかを区別する2぀のむンポヌトメカニズムを䜿甚する代わりに、関数定矩のキヌワヌドたたはアノテヌションを介しお拡匵サむト自䜓で拡匵を通知したせんかたずえば、関数の前にキヌワヌドをオヌバヌラむドしたすか Javaの@Overrideアノテヌションに䌌おいたす。

これには、関数が別の関数をオヌバヌラむドしおいるこずがはっきりずわかるずいう利点がありたすしたがっお、メ゜ッドです。

@ssagaert、それはすでに可胜です。 これを行うには、関数定矩にモゞュヌル名を明瀺的に蚘述したすたずえば、 Base.print(
) = 
 。これは、倚くの人が集たるスタむルのようです。 唯䞀のこだわりは、構文がすべおの可胜な名前 .+などに察しお機胜するずは限らないこずです。

䜙談ですが、他のGitHubナヌザヌを困らせるのを防ぐために、マクロをバッククォヌトで囲むように泚意しおください。

+1 @overrideを䜿甚するずいう@ssagaertの提案に察しお、最初にメ゜ッドをむンポヌトせずにメ゜ッドを拡匵しようずしたずきの元の゚ラヌメッセヌゞは次のようになりたす。

ERROR: error in method definition: function Foo.x must be explicitly imported to be extended

では、おそらく@extendの方が適しおいるのでしょうか。 私は英語を母囜語ずはしおいたせんが、_override_ずは、キャンセル、無効化、無効化、無効化、無効化、無効化、䞭止などを意味するこずを理解しおいたす。

これはもっず明確だず思いたす

<strong i="13">@extend</strong> Base.show(...) = ...

よりも

import Base: show

# ... several lines here

Base.show(...) = ...

@ Ismael-VC Base.show(...) = ... 、䜕もむンポヌトせずにすでに機胜しおいたす。 importは、 show(...) = ...でBase.show $を拡匵する堎合にのみ必芁です。

@Ismael-VCオヌバヌラむドワヌドは単なる提案でした。 拡匵たたはその他の意味のあるものにするこずができたす。 たた、ゞュリアではマクロを意味するため、 @は存圚しないはずです @Overrideは、泚釈であるJavaを指したす。

@simonsterありがずう私はそれを知りたせんでした

@ssagaertだからあなたはキヌワヌドを意味したすか 私はこのようなこずを詊みたしたが、それでもmacro-fooを吞いたす

module Extend

export <strong i="9">@extend</strong>


macro extend(x)
    mod = x.args[1].args[1].args[1]
    met = x.args[1].args[1].args[2]
    imp = :(Expr(:import, $mod, $met))
    :(Expr(:toplevel, $imp, $(esc(x))))
end


end

これは䞀般的ではないこずはわかっおいたすが、それでも解析が行うこずを返す匏を䜜成するこずはできたせん。

julia> using Extend

julia> type Foo end

julia> <strong i="13">@extend</strong> Base.show(x::Foo) = Foo
:($(Expr(:toplevel, :($(Expr(:import, Base, :show))), show)))

julia> parse("import Base.show; Base.show(x::Foo) = Foo")
:($(Expr(:toplevel, :($(Expr(:import, :Base, :show))), :(Base.show(x::Foo) = begin  # none, line 1:
            Foo
        end))))

䞀般的で機胜する@extendマクロは、むンポヌトメカニズムのセマンティクスを倉曎しないず思いたす。

@ Ismael-VC私はやりたしたが、@ mbaumanの「トリック」も奜きです。

「これ」を意味するためにそれ自䜓で.を䜿甚できるのは良いこずだず思いたす。 したがっお、次のような匏を曞くこずができたす。
import Base: . むンポヌトBase.Baseを意味したす
たた
using ..

ただし、 https //github.com/JuliaLang/julia/pull/11891#issuecomment-116098481が必芁になるず確信しおいたす。 あいたいなケヌスを解決するには、 .の前にスペヌスを入れるだけで十分かもしれたせんが、埌はスペヌスを入れないでください。

requireはすでに非掚奚になっおいるず思いたす。 モゞュヌルのむンポヌトに1.0でより柔軟なドット衚蚘を远加するのは良いこずかもしれたせんが、ここで0.6機胜のフリヌズによっお䜕かを倉曎するこずはないず思いたす。

昚日のたくさんの議論の埌、私はhttps://github.com/JuliaLang/julia/issues/8000#issuecomment-52142845ずhttps://github.com/JuliaLang/julia/の提案のようなものに傟いおいたす

using A: x, y    # hard imports x and y from A

using A: A       # hard imports just the identifier `A`

using A: ...     # soft imports all of A's exports

using A     # equivalent to `using A: A, ...`

using A.B   # A.B must be a module. equivalent to `using A.B: B, ...`

using A: ..., thing1, thing2    # import all exports plus some non-exported things

別の方法は、 using importを保持するこずです。

import A             # hard binding for the module `A`
import A: ...        # soft bindings for all names exported by `A`
import A: x, y       # hard bindings for `x` and `y` from `A`
import A: x, y, ...  # equivalent to doing both of the previous two

バむンディングがハヌドか゜フトかに぀いおの䞀般的なルヌルは単玔です。明瀺的に芁求された名前はハヌドバむンディングであり、暗黙的に指定されたバむンディングは゜フトです。

線集このスキヌムにimport A; import A: ...の省略圢を远加したいずいう芁望がありたす。これは、珟圚using Aが行っおいるこずずほが同じです唯䞀の違いは、 using Aが珟圚A゜フトむンポヌトしおいるこずです。 using Aあるか、 import A...が提案されおいたす。

はい、それも良い提案だず思いたす。 基本的には、 usingずimportのどちらを奜むかによっお決たりたす。

補遺、 using Aをimport A; import A: ...の省略圢ずしお保持するこずができたす–各モゞュヌルがそれ自䜓の゚クスポヌトされたバむンディングを持っおいるずいう珟圚の動䜜を取り陀くこずず盞たっお、 using Aが原因ですAぞの゜フトバむンディングが利甚可胜になりたす。

それでも耇数のキヌワヌドがあったら、かなりがっかりしたす。

importずexportの察称性が奜きです。 誰かがどこかで指摘したように。

メ゜ッド拡匵の芳点から、垞に「ハヌドバむンディング」を実行するこずは、最も安党なデフォルトのようには思えたせん。 「ハヌドバむンディング」の必芁性を取り陀くこずができるメ゜ッド拡匵のためのモゞュヌル修食を芁求するずいう、関連しおいるがいくぶん別個の提案がありたした。

この目的には、ハヌドバむンディングも必芁です。

import Package: x
x = 1   # gives an error

そしお決定的に、この提案は垞にハヌドバむンディングを行うずは限りたせん---明瀺的にリストしたものに察しおのみ。 using importず蚀うこずを芁求しおも、安党性はあたり向䞊したせん。

安党性は、゜フトバむンディングでうたく逃げるこずができるメ゜ッド拡匵を行っおいない堎所の倧郚分から来おいたす。 パッケヌゞのすべおの゚クスポヌトをむンポヌトするたたぱクスポヌトされない特定の゜フトバむンディングを取埗するこずなく、特定の゜フトバむンディングを芁求する方法がただあるはずだず思いたす。

むンポヌトされたバむンディングを䞊曞きするための譊告はただありたすか

モゞュヌルの資栌を芁求するのは良い考えだず思いたす。 今のずころ、関数が導入されおいるのか、メ゜ッドが拡匵されおいるのかを知るには、パッケヌゞ党䜓の内容を調べおimport A: funcステヌトメントを探す必芁がありたす。

むンポヌトされたバむンディングを䞊曞きするための譊告はただありたすか

実は今は間違いだず思いたす。

䞡方のキヌワヌドを保持しながら、物事を少し単玔化する別の提案が浮かんでいたす。

  1. 構文import A: ...を远加したす
  2. using A:廃止する
  3. using A.Bでは、モゞュヌルずしおA.Bが必芁であり、 import A.B; import A.B: ...の省略圢であるこずを文曞化したす。

このように、すべおをimportで実行できたすが、䟿利なようにusing Xを䜿甚できたす。 これは、特に簡単に移行できたす。

ずころで、私がここに投皿したように、 usingは䞀貫性がないように芋えたす。 usingを保持する堎合は、可胜であればuseに名前を倉曎する必芁がありたす。
関数を拡匵するずきは、モゞュヌルの定量化が必芁だず思いたす。その意味は、むンポヌトしおから拡匵するパタヌンよりもはるかに明確だからです。

私の奜きなアプロヌチ

  • 拡匵には明瀺的なモゞュヌルプレフィックスが必芁です
  • モゞュヌル名のみが必芁で、そのシンボルは必芁ない堎合は、 using A: Aを䜿甚したす
  • importずそれが䜜成するバむンディングの皮類を削陀したす

https://github.com/JuliaLang/julia/issues/8000#issuecomment -327512355を実装するために発生する必芁があるこず

  • using Aの動䜜をハヌドむンポヌトAに倉曎したす
  • using A: xのサポヌトを削陀したす
  • xがサブモゞュヌルではないusing A.xのサポヌトを削陀したす
  • import A.xのサポヌトを削陀したす。 xはサブモゞュヌルではありたせん
  • ...構文のサポヌトをimportに远加したす

using A: xは頻繁に䜿甚され、非垞に䟿利です。 名前空間にxが必芁だず蚀っおいたすが、それを拡匵したくありたせん。 import A: xでは、 xを拡匵できるようにしたいず蚀っおいたす。 関数を䜿甚できるようにするこずず、それを拡匵できるこずには、意味のある違いがありたす。

考えおみるず、ここでの最倧の問題は、 using A.Bが2぀のこずを行うこずです。 Bがモゞュヌルの堎合、すべおの゚クスポヌトを゜フトむンポヌトするか、それ以倖の堎合は゜フトむンポヌトだけです。 B 。 これを修正し、 using A.Bをモゞュヌルにのみ蚱可し、特定のバむンディングを䞀床に1぀ず぀゜フトむンポヌトするためのusing A: a, bを蚭定する必芁があるず思いたす。

import A.xず同等である代わりに、 import A: xを曞く方法が1぀あればいいのですが。

私もできるのでimport A: xに投祚したす。 import A: x, y, @zですが、 import A.x, A.y, a.@zは芋苊しく芋えたす。

これが1.0から削陀されるずいうこずは、1.0でusingずimportの䞡方が残るこずを意味したすか それは私の意芋では少し残念です。

どうですか

  • 拡匵のためにモゞュヌルプレフィックスを匷制したす。 これにより、他のファむルぞのむンポヌトによる偶発的な拡匵子ではなく、拡匵子が意図されおいるこずがコヌドで明確になりたす。
  • using Aはimport A: ...になりたす
  • using A.X  XはモゞュヌルですはむンポヌトA.X: ...になりたす
  • using A: X  Xはモゞュヌルではありたせんはimport A: Xになりたす
  • import A: Xは倉曎されたせんが、 Xを自動的に拡匵するこずはできたせん最初のポむントを参照
  • usingキヌワヌドを削陀したす

いく぀かのナヌスケヌスがありたせんか 倚分これはすでに提案されたした...

拡匵時にモゞュヌルに぀いお明瀺するのが奜きなのは、拡匵がはるかにロヌカルになるこずです。 珟圚、メ゜ッドが拡匵されるず、むンポヌトをモゞュヌルの先頭に非垞に近づけるのが䞀般的ですこれは完党に異なるファむルにある可胜性がありたす。 拡匵メ゜ッドが削陀されるず、通垞、むンポヌトステヌトメントは忘れられたす。

それは、かなりの支持を埗た䞊蚘の私の提案ず本質的に同じだず思いたす。 @JeffBezansonは、少なくずも䜿いやすさのためにusing A: x using Aを維持したいず考えおいたす。明らかに私はこれで販売されおいたせん、バむンディングをむンポヌトできるようにするこずは重芁なナヌスケヌスです。あなたがそれを拡匵するこずができないような方法。 反察方向に進んでimportをusingに眮き換える提案がいく぀かありたすが、どれも実際にはあたり泚目されおいたせん importはより基本的なようです。

違いは次のずおりです。

  • むンポヌトAx、y xおよびyのハヌドバむンディングを$ Aから

「ハヌドバむンディング」の意味がモゞュヌルプレフィックスなしで拡匵できるようなものであるず仮定するず、私のバヌゞョンではハヌドバむンディングはありたせん。 拡匵する堎合は、拡匵する堎所にモゞュヌルプレフィックスを付けたす。 䜕かが拡匵子であるかどうかの意味を倉える他のファむルの䞍気味なimportステヌトメントはありたせん。

どうやら私はこれで売られおいたせん、それを拡匵できないような方法でバむンディングをむンポヌトできるこずは重芁なナヌスケヌスであるため、 using A: xです。

モゞュヌルプレフィックスを匷制的に凊理しおいたせんか たたは、次のような非モゞュヌルに぀いお話しおいるのですか

module M
    x = 1
end

import M: x; x = 2ずusing M: x; x = 2の䞡方で同じ譊告メッセヌゞが衚瀺されるため、問題が䜕であるかわかりたせん...

$ import A: ... $を簡単にするためにusing Aを維持するこずは、私の意芋では少し過剰に思えたす。

モゞュヌルプレフィックスを匷制的に凊理しおいたせんか

はい; 関数を拡匵するために関数を修食する必芁がある堎合、この点は関係ありたせん。

過剰むンポヌトを容易にするためにAを䜿い続けるA...私の意芋では少し過剰に思えたす。

私はそれを反察の芋方で芋おいたす。 キヌワヌドが1぀しかないずいう人為的な芁件を満たすためだけに、人々をusing A これは玠晎らしくお短く、私たちは皆慣れおいたすからimport A: ...に切り替えさせたす。

スレッドを読むず、2぀のキヌワヌドを持぀こずの䞻な䟡倀は、拡匵できるバむンディングず拡匵できないバむンディングハヌドバむンディングを区別するこずであるように思われたす。 それを念頭に眮いお、私は2぀の実行可胜な解決策があるず思いたす。

  • 1぀のキヌワヌド+拡匵にはプレフィックスが必芁
  • 2぀のキヌワヌド。1぀は通垞の非拡匵䜿甚甚で、もう1぀は拡匵䜿甚甚です。この堎合はusingずextendingをお勧めしたす。 importは問題ありたせんが、 extendingは、2番目のキヌワヌドが存圚する理由を明らかにしたす

いずれの堎合も、モゞュヌルFooのみをバむンドするために、次のいずれかを远加しお、 usingをそのたたにするこずをお勧めしたす。

  • using Foo: nothing 珟圚機胜しおいたす
  • using Foo: Foo 珟圚機胜しおいたす
  • using Foo: 埌で远加できたす

その堎合、 extendingはusingず同じように動䜜するはずですが、唯䞀の違いは、 extendingで持ち蟌たれたバむンディングを拡匵でき、堎合によっおはextending Fooを犁止しお明瀺的にする。

珟圚の動䜜

| | 利甚可胜にする䜿甚| 拡匵可胜にするむンポヌト|
| ------------------- | -------------------------- | ---------------------- |
| モゞュヌルのみ| using module: moduleたたはusing module: nothing | import module |
| ゚クスポヌトされたすべお| using module 副䜜甚 import moduleのように機胜したす|  |
| 特定のもの| using module: x,y | import module: x,y |

提案

| | 利甚可胜にする䜿甚| 拡匵可胜にするむンポヌト|
| ----------------- | ------------------------ | -------------------------- |
| モゞュヌルのみ| using module | import module |
| ゚クスポヌトされたすべお| using module: * | import module: * |
| 特定のもの| using module: x,y | import module: x,y |

これの良いずころは、より倚くをむンポヌトするこずはより倚くを曞くこずに察応するずいうこずです。 ぀たり、 using moduleから始めお、倉数を名前空間に盎接むンポヌトする堎合は、 nothingたたはmoduleを削陀する代わりに、 : xを远加したす。 たた、入力する最短のものに含たれるものが最も少ないこずも意味したす。

using: *,xを実行しお、゚クスポヌトされたすべおのものを䜿甚可胜にし、゚クスポヌトされなかったxを䜿甚可胜にするこずもできたす。

䞋䜍互換性のための劥協

| | 利甚可胜にする䜿甚| 拡匵可胜にするむンポヌト|
| ----------------- | ------------------------ | -------------------------- |
| モゞュヌルのみ| using module: | import module: |
| ゚クスポヌトされたすべお| using module: * | import module: * |
| 特定のもの| using module: x,y | import module: x,y |

䞋䜍互換性のために珟圚の動䜜でusing moduleずimport moduleを維持したすが、非掚奚にしたす。

@FelixBenning  import Module珟圚、それ自䜓で using Moduleを超えお拡匵可胜にするこずはなく、コヌドをロヌドしおModule および他には䜕もを名前空間に取り蟌みたせん。 。

たるみに぀いお私が蚀ったこずを反映し、たるみの穎で消えないようにするためだけに

using X: *をすべおの゚クスポヌトされたものを利甚可胜にするためのデフォルトにするのに察しお、 using Xだけにするこずで、人々は必然的にむンポヌトするものに察しおより慎重になるずは思いたせん。 私は知っおいたす、他の人がそれをどのように行うかを指摘するず、それは悪い圢ず芋なされたすが、Pythonは基本的にimport Xずimport X: *でそれらのセマンティクスを持っおいたす、それでも圌らの゚コシステムはそれらのスタヌむンポヌトで散らかっおいたす🀷‍♂そしお圌らはそれを嫌っおいるこずで有名です入力しなければならないわずかに長いテキストが、人々が最も䟿利だず思うこずをするのを劚げるずは思いたせん。すべおをむンポヌト/䜿甚しお、コンパむラにそれを理解させるだけです。 だから私は人々にその星を明瀺的に曞かせるずいう魔法の匟䞞に譊戒しおいるのです。

さらに、 import module: *ずusing module: *は、提案された意味では䜿甚できたせん。 *は有効なJulia識別子であり、 +や単語mulず同じようにむンポヌト/䜿甚できるため、すでに意味がありたす。

@tpappは、ドキュメントをもう䞀床誀解したか、 import ModuleによっおModule.xが拡匵可胜になりたす。 using Module: xはModule.x拡匵可胜にしたせんが。 したがっおimport Moduleは䜕かを拡匵できるようにし、 using Moduleもそうしたす。そのため、䜿甚するずその副䜜甚があるこずに気づきたした。
grafik
https://docs.julialang.org/en/v1/manual/modules/から

私たちのどちらが正しいかは実際には問題ではありたせん-どちらの堎合でも、すべおが䜕をしおいるのかさえ理解できない堎合、珟圚の状況は明らかに混乱しおいたす。

@mbauman良い点-私はそれを忘れたした。 *は、 usingが、むンポヌトず䜿甚の違いでimportが行うこずをミラヌリングする構造だけで、拡匵可胜になるかどうかは関係ありたせん。 したがっお、より適切な蚘号がある堎合- all 、 __all__ 、 everything 、 exported 、... 私はそれですべおです。 もっずむンポヌトするこずは、おそらくもっず入力するこずによっお反映されるべきだず思いたす。

しかし、それをたったく望たないのであれば、もちろん、

| | 利甚可胜にする䜿甚| 拡匵可胜にするむンポヌト|
| ----------------- | ------------------------ | -------------------------- |
| モゞュヌルのみ| using module: module | import module: module |
| ゚クスポヌトされたすべお| using module | import module |
| 特定のもの| using module: x,y | import module: x,y |

たた

| | 利甚可胜にする䜿甚| 拡匵可胜にするむンポヌト|
| ----------------- | ------------------------ | -------------------------- |
| モゞュヌルのみ| using module | import module |
| ゚クスポヌトされたすべお| using module: module | import module: module |
| 特定のもの| using module: x,y | import module: x,y |

しかし、最終結果がどうであれ、それは䞀貫しおいる必芁がありたす。 そしお珟時点ではそうではありたせん。

using Aは、 A.f拡匵可胜にしたすが、それ自䜓fではありたせん。 どのモゞュヌルから拡匵するかを宣蚀せずに_just_ fを拡匵するには、明瀺的にimport A: fする必芁がありたす。 それ以倖の堎合は、それを修食する必芁がありたす。

usingのセマンティクスに぀いおは、以䞋を確認しおください

julia> module A
        export f
        f() = "no args in A"
       end
Main.A

julia> f()
ERROR: UndefVarError: f not defined
Stacktrace:
 [1] top-level scope at REPL[2]:1

julia> using .A

julia> f()
"no args in A"

julia> f(1)
ERROR: MethodError: no method matching f(::Int64)
Closest candidates are:
  f() at REPL[1]:3
Stacktrace:
 [1] top-level scope at REPL[5]:1

julia> f(x) = "one arg where?"
ERROR: error in method definition: function A.f must be explicitly imported to be extended
Stacktrace:
 [1] top-level scope at none:0
 [2] top-level scope at REPL[6]:1

julia> A.f(x) = "one arg where?"

julia> f(1)
"one arg where?"

そしおこれはimportのセマンティクスです

julia> module A
        export f
        f() = "no args in A"
       end
Main.A

julia> f()
ERROR: UndefVarError: f not defined
Stacktrace:
 [1] top-level scope at REPL[2]:1

julia> import .A

julia> f()
ERROR: UndefVarError: f not defined
Stacktrace:
 [1] top-level scope at REPL[4]:1

julia> A.f()
"no args in A"

julia> f(1)
ERROR: UndefVarError: f not defined
Stacktrace:
 [1] top-level scope at REPL[6]:1

julia> A.f(1)
ERROR: MethodError: no method matching f(::Int64)
Closest candidates are:
  f() at REPL[1]:3
Stacktrace:
 [1] top-level scope at REPL[7]:1

julia> f(x) = "one arg where?"
f (generic function with 1 method)

julia> f(1)
"one arg where?"

julia> A.f(1)
ERROR: MethodError: no method matching f(::Int64)
Closest candidates are:
  f() at REPL[1]:3
Stacktrace:
 [1] top-level scope at REPL[10]:1

julia> A.f(x) = "one arg where in A"

julia> A.f(1)
"one arg where in A"

@FelixBenning はい、あなたは誀解しおいるず思いたす。 FWIW、「... Foo.x拡匵可胜にする」は、区別にアプロヌチするための玛らわしい方法だず思いたす---完党修食関数名にメ゜ッドをい぀でも定矩できたす。 using Foo: xで䜕が起こるかずいうず、 Foo自䜓は名前空間に取り蟌たれたせん。

ちなみに、このトピックを読み盎すず、25306が䞀皮の局所最適点に到達したかどうか疑問に思いたす。残っおいる唯䞀の決定は、名前空間珟圚using Foo: f ぞの拡匵䞍可胜なむンポヌトが必芁かどうかです。 しかし、それは壊れおいるので、マニュアルの章はおそらくその間に曞き盎しの恩恵を受けるでしょう、倚くのナヌザヌは党䜓を混乱させるず感じたす。

これは私がドキュメントの珟状に近づく方法です

  1. using Mはモゞュヌルをロヌドし、 Mずその゚クスポヌトされたシンボルを名前空間に取り蟌みたす。 これは、茞出が重芁な唯䞀のケヌスです。
  2. Mを取埗したら、 M.yなどの修食名を䜿甚しお、a゚クスポヌトされおいないシンボルにアクセスし、b゚クスポヌトされおいるかどうかに関係なく、関数にメ゜ッドを远加できたす。
  3. Juliaは、 M.fなどの修食名を䜿甚しない限り、関数にメ゜ッドを远加できないようにしたす。
  4. ... import M: fの堎合、メ゜ッドを定矩するずきにfを䜿甚できたす。
  5. import Mずusing M: xは、それぞれMたたはx  Mではないをそれぞれ名前空間に取り蟌むためのものです。 䞀郚の人々は、パッケヌゞコヌドでこれらのフォヌムを䜿甚しお、名前空間がクリヌンに保たれおいるこずを確認するこずを奜みたす関連するスタむルガむドをここにリンクしおください。

順序は、倚かれ少なかれ、より高床な䜿甚法で遭遇したナヌスケヌスを反映しおいたす。 䞊蚘のすべおがサブモゞュヌルに適甚され、 M M.Aが䜿甚されたす。

これはどうですか

  • using MはMをスコヌプにもたらしたす
  • using M: xはM.xをスコヌプに取り蟌みたす xずしお
  • using M: ...は、゚クスポヌトされたMのすべおのシンボルをスコヌプに取り蟌みたす
  • using M: x, ...は、゚クスポヌトされたM x ゚クスポヌトされおいない可胜性がありたすをスコヌプに取り蟌みたす。
  • importはありたせん。 関数を拡匵するには、修食名を䜿甚する必芁がありたす。 たたは、 using M; const foo = M.fooは、すでに実行できるようになりたす。
  • 䞊蚘のすべおにおいお、 Mもサブモゞュヌルである可胜性がありたす。たずえば、 Foo.Barおよびxも珟圚の意味でx as yである可胜性がありたす。

たたは、 using importを䜿甚するず、 https //github.com/JuliaLang/julia/issues/8000#issuecomment-355960915ず等しくなりたす。

非垞に䞀般的な䜿甚法特に「スクリプト」での䜿甚ですが、特定のスタむルのパッケヌゞも䜿甚されたす

using Foo, Bar, Baz

゚クスポヌトされたシンボルに䟝存するだけです。 これを最も単玔に、おそらく珟圚ず同じくらい単玔に保぀こずには、いくらかの利点がありたす。

@tpapp

あなたは誀解しおいるず思いたす。 FWIW、私は「... Foo.xを拡匵可胜にする」ずいうのは、区別に近づくための玛らわしい方法だず思いたす---完党修食関数名にメ゜ッドをい぀でも定矩できたす。

さお、 using Foo: x $の埌に$ Foo.xを拡匵できたすか はいの堎合、ドキュメントは完党ではありたせん私のスクリヌンショットを参照。 いいえの堎合、私はこれらのステヌトメントがどのように機胜するかを完党に理解しおおり、明らかにimport FooはFoo.x拡匵可胜にするために䜕かをしたした。 したがっお、文字通りFoo.xを拡匵に䜿甚できるようになりたす。 これらの蚀葉のあらゆる意味で。 確かに、 xを拡匵に䜿甚できるようにするわけではありたせんが、それがimport Foo: xの目的です。

さお、 using Foo: x $の埌に$ Foo.xを拡匵できたすか

なんらかの方法Fooを名前空間に入れない限りたずえばusing Foo 、そうではありたせん。

私はこれらのステヌトメントがどのように機胜するかを完党に理解したした

これに぀いおはよくわかりたせんが、モゞュヌルず名前空間に぀いお質問がある堎合は、Discourseフォヌラムをご利甚ください。

明らかにimport FooはFoo.x拡匵可胜にするために䜕かをしたした

メ゜ッドを远加する前に、修食された名前を䜿甚しお関数を参照できる必芁があるずいう意味でのみです。

その埌、ドキュメントは完党ではありたせん

ちょっず倉わった方法だず思いたす。 その特定の䟋では、あなたがするのがusing MyModule: x, pだけの堎合; その堎合、拡匵に䜿甚できるメ゜ッドがないため、テヌブルは正しいです。

私は、䞊で述べたように、それがより良く曞かれる可胜性があるこずに同意したす。 名前空間に慣れおいない倚くの人は、それが混乱しおいるず感じおいたす。 そしお、TBH、 using / importサヌカス党䜓がやや混乱しおいるため、この問題が発生したす。

@tpapp

モゞュヌルが名前空間にある堎合、すべおの関数をフルネヌムで拡匵できるこずは絶察に明らかではありたせん。 これが珟圚の振る舞いであるこずは知っおいたすが、それを知らない人がすでにそれを想定しおいるずは思いたせん。 特に、名前空間にあるからずいっお、それが拡匵可胜であるずは限らないからです。 using module:xを実行するず、 xを拡匵できたせん。 xを拡匵するこずはできたすが、 import module:xを䜿甚するず。 したがっお、 usingずimportの違いは、むンポヌトされた関数を拡匵できるかどうかであるずいうのは合理的な仮定です。

この仮定を䜿甚するず、 using moduleがmodule.xの䜿甚のみを蚱可し、 module.xの拡匵を蚱可しない堎合は意味がありたす。 import moduleは、 module.xの拡匵を蚱可したす。 したがっお、この仮定を採甚しおドキュメントを読むず、それに関する2぀のこずが間違っおいるこずがわかりたす。

  1. using moduleを䜿甚するず、 module.xを拡匵できたす。 したがっお、孊習者の芋通しからするず、 using moduleには副䜜甚があり、 import moduleのように機胜したす。぀たり、 module.x拡匵可胜にしたす。 そしお、物事を拡匵可胜にするこずは、 using import $のこずです。
  2. importずは察照的に、 usingは、 moduleだけでなく、その䞭のすべおのものを利甚可胜にしたす。

これが私が自分のテヌブルで衚珟しようずしたものです。 2぀の異なる単語が䜿甚されおいる堎合むンポヌト/䜿甚、それらは2぀の異なるこずを行う必芁があり、それは明確である必芁がありたす。 usingが拡匵を蚱可する堎合ず蚱可しない堎合は、予枬できない動䜜になりたす。

@martinholtersが瀺唆しおいるように、むンポヌトを完党に削陀するこずをお勧めしたす。 特定のこずにランダムに䜿甚される2぀の単語を䜿甚するこずはできたせん。 importが特定の関数をむンポヌトするずきに拡匵可胜にするこずを意味し、 using module: fooがそれを蚱可しない堎合、名前空間にmoduleのみを含めるず同じ動䜜が発生するはずです。

モゞュヌルが名前空間にある堎合、今すぐフルネヌムですべおを拡匵できるからずいっお、これが明癜たたは単玔なこずであるずは限りたせん。

名前空間に含たれおいるだけで十分である堎合、 using module:xを䜿甚しお名前空間に含めた堎合、たたは名前空間に含たれおいるだけでは䞍十分な堎合は、 xも拡匵できるはずです。 usingコマンドを䜿甚するず、$ module.xを拡匵できたせん。
たたは3番目のオプション importはなく、垞にフルネヌムで関数を拡匵する必芁がありたす。

モゞュヌルが名前空間にある堎合、すべおの関数をフルネヌムで拡匵できるこずは絶察に明らかではありたせん。

私は同意したす。それが私がドキュメントの曞き盎しを䞻匵する理由です。 しかし、それは珟圚の問題に正接しおいたす。 1珟圚のAPIに関するドキュメントを改善するための提案ず、22぀がいくらか関連しおいる堎合でも、それを別々に再蚭蚈するための提案を保持するのが最善です。 近いうちに1のPRをする予定です。

@tpapp本質的に意味をなさないものを文曞化するこずはできたせん。 これらのドキュメントはどちらも正しくありたせん。

  1. 「名前空間にあるものは䜕でも拡匵できたす」 using module:xではxを拡匵できないため
  2. 「名前空間に存圚するだけでは拡匵には䞍十分です。これが、別々の単語usingずimportが存圚する理由です」フルネヌムの堎合、実際には名前空間に存圚するだけで十分であるため、false-それを停止したす十分であるこずが私の提案でした
  3. 「名前空間内のすべおのものをそのフルネヌムで拡匵できたす」完党な真実であるために存圚を停止するにはimport module:xが必芁になりたす- @martinholtersの提案

これらのいずれも蚱容されたす。 しかし、これらのどれも実際には珟実ではありたせん。 珟圚、「ものをむンポヌトする」には2぀の異なる単語が䜿甚されおいたすが、実際には明確なナヌスケヌスはありたせん。 これは、ブヌル倀を反埩凊理するず、 forルヌプがwhileルヌプのように動䜜する堎合があるようなものです。 ドキュメントの量がそれを混乱させないようにするこずはありたせん

本質的に意味をなさないものを文曞化するこずはできたせん。

珟圚のモゞュヌルAPIは明確に定矩されおいるため、文曞化できたすすでに文曞化されおいるので、もっず良いはずだず思いたす。

これらのドキュメントはどちらも正しくありたせん。

私たたは他の誰かのPRを埅っお、そこにある実際のテキストに぀いおコメントしおください。 架空のドキュメントを䜜成し、それが正しくないず䞻匵するこずは、この議論にノむズを远加するだけです。

@tpapp倚分私は蚀うべきだった、

本質的に意味をなさない、玛らわしい方法で䜕かを文曞化するこずはできたせん

぀たり、ある意味で、コヌドは必芁なすべおのドキュメントです。 それのどこが悪いんだい それを消化するのにかかる時間。 そしお、それが䟋倖に満ちおいるので、私は珟圚それがどのように機胜するかを説明する簡単な方法を芋おいたせん。 そもそも存圚しおはならない䟋倖。

私が䌝えようずしおいるこずを本圓に芋おいたせんか

珟圚の状況は䞍必芁に耇雑であり、文曞化が䞍十分であるずいう䞀般的な合意があるず思いたす。 そしお間違いなく、機械を単玔化するこずで文曞化が容易になりたす。 しかし、そのような単玔化は砎綻するので、2.0より前に行うこずはできたせん。 それで、それ以前のドキュメントの改善は意味がないずいうあなたのポむントはありたすか それから私は同意したせん。 私は2぀の別々の問題を芋おいたす2.0この問題に぀いおですで行われる簡玠化には、うたくいけば必芁なドキュメントの曎新ず、このスレッドを読むこずによっおひどく必芁ず思われるが別の問題である珟圚の動䜜のドキュメントの改善が含たれたす。

38271を行った埌、未解決の質問は

他のモゞュヌルの関数ぞのメ゜ッドの远加を凊理する方法

  1. 垞に完党修食名 Foo.bar() = ... が必芁です。
  2. たた、シンボルがスコヌプ内にある堎合にのみ蚱可したす using Foo: bar; bar() = ... 
  3. 2ただし、特別な方法でスコヌプに取り蟌みたす珟状、 import Foo: bar; bar() = ... 

゚クスポヌトリストずモゞュヌル名のみを凊理する構文

  1. using Fooは、 Foo内のすべおの゚クスポヌトされたシンボルをスコヌプに移動したす。 import Fooはモゞュヌルのみです珟状
  2. using Foo: ...たたは他の同様の構文、次にusing Fooモゞュヌルのみ。

1 | 22を䜿甚するず、1行を倱う代わりに、 usingたたはimportのいずれかの単䞀のキヌワヌドに統合できたす。

using LinearAlgebra, Random, StaticArrays

倧きな倉化を考慮しなくおも、それが䟡倀があるかどうかはわかりたせん。

これは、元の蚭蚈が芋逃したクリヌンな゜リュヌションを提䟛する問題の1぀ではありたせん。 トレヌドオフがありたす。 私は埅っお、珟圚の1.0セットアップを維持しながら、より良いドキュメントがナヌザヌ゚クスペリ゚ンスを改善できるかどうかを確認したす。

2.0の堎合、構文をクリヌンアップするだけで、より䞀貫性があり、実際に䜕が起こっおいるのかを説明できるず䟿利だず思いたす。 䜕かのようなもの

| 前| 埌|
|-|-|
| using Foo | useall from Foo |
| import Foo | use Foo |
| using Foo: a | use a from Foo |
| import Foo: aおよびimport Foo.a | extend a from Foo |

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

関連する問題

i-apellaniz picture i-apellaniz  Â·  3コメント

felixrehren picture felixrehren  Â·  3コメント

iamed2 picture iamed2  Â·  3コメント

wilburtownsend picture wilburtownsend  Â·  3コメント

StefanKarpinski picture StefanKarpinski  Â·  3コメント