Scala пакет delcaration - с одной стороны объекты пакета видны, с другой - нет? - PullRequest
4 голосов
/ 22 апреля 2011

В foo/bar/my_package/package.scala:

package foo.bar
package object my_package {
  type SomeType = java.lang.String
}

Затем в foo/bar/my_package/my_sub/MyClass.scala

package foo.bar.my_package.my_sub

class MyClass {
  var x: SomeType = _
}

Это не компилируется; SomeType не найдено. Если я изменю MyClass.scala на

package foo.bar.my_package
package my_sub

class MyClass {
  var x: SomeType = _
}

Все отлично работает. Какая разница!?! ??!

(это Scala 2.8.1)

Ответы [ 2 ]

5 голосов
/ 22 апреля 2011

Декларации пакетов, такие как импорт, дают вам доступ ко всему, что находится внутри них. Итак, когда вы

package foo.bar.my_package

тогда у вас есть все, что было бы, если бы вы сделали

import foo.bar.my_package._

Кроме того, объявление пакета в одной строке означает, что все нижеуказанное принадлежит этому пакету:

package foo.bar.my_package {
  package my_sub {
    class MyClass { var x: SomeType = _ }
  }
}

(что эквивалентно:

package foo.bar.my_package
package my_sub
class MyClass { var x: SomeType = _ }

)

чтобы вы могли видеть, как содержимое foo.bar.my_package должно находиться в области видимости в этом случае. В другом случае доступно только содержимое foo.bar.my_package.my_sub, которое не включает SomeType.

2 голосов
/ 22 апреля 2011

Это вопрос видимости.

package foo.bar.my_package.my_sub

class MyClass {
  var x: SomeType = _
}

Когда вы объявляете x, видны следующие вещи:

  • Каждый член MyClass
  • Все внутри foo.bar.my_package.my_sub
  • Каждый член scala.Predef
  • Все внутри scala
  • Все внутри java.lang

Тип SomeType не входит ни в один из них.

С другой стороны, когда вы делаете:

package foo.bar.my_package
package my_sub

class MyClass {
  var x: SomeType = _
}

Тогда видимость:

  • Каждый член MyClass
  • Все внутри foo.bar.my_package.my_sub
  • Все внутри foo.bar.my_package
  • Каждый член scala.Predef
  • Все внутри scala
  • Все внутри java.lang

А SomeType находится внутри foo.bar.my_package, что является второй строкой.

Схожий вопрос: почему это так работает? Вы можете начать здесь , хотя есть вопрос именно о , что . Мне не очень нравится ответ на этот вопрос, поскольку он действительно не затрагивает причины этого. содержит ссылку на страницу на scala-lang о новых функциях Scala 2.8, на которой Одерский объясняет причины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...