在Scala中创建可导入文件的最简单方法是什么?

时间:2018-02-18 02:04:50

标签: scala import

TLDR :在try{}catch中创建可导入文件的最简单方法是什么?

这是初学者的问题。

我已经学习了Scala几个星期,现在有一些代码可以在几个文件/不同项目之间共享。我尝试了很多导入结构,但没有一个工作。要求是:

  1. 要导入的文件应位于完全不同的目录中。
  2. 要导入的文件应该可以由独立项目导入。
  3. 要导入的文件是单个Scala文件。
  4. (可选)要导入的文件应包含.scala s,defobject s。
  5. 示例:

    • 要导入的文件位置:case classe
    • 使用项目(1)位置的文件:/some/path/to_be_imported.scala
    • 使用项目(2)位置的文件:/abc/def/will_import01.scala

    我不是要创建一个包或分发它。

    考虑到我已经知道的编程语言,看看我如何解决这个问题:

    由于我精通/xyz/rst/will_import02.scala,如果此问题引用Python,我会给出预期的答案版本:

    在这种情况下你可以:

    1. 将您的文件放在已执行文件的同一目录中,然后运行:Python。例如:

      python3 ./your_file.py

      请注意,它们位于完全相同的目录中(这与上面的第2点相矛盾,但它解决了问题)。

    2. 将文件目录添加到➜ another_path|$ python3 ./main_module/main_file.py 1 self printing ➜ another_path|$ tree . ======================================================================= . └── main_module ├── main_file.py ├── __pycache__ │   └── sample_file_to_be_imported.cpython-36.pyc └── sample_file_to_be_imported.py 环境变量,然后运行您的模块(最佳答案):

      PYTHONPATH
    3. 文件内容:

      ➜  random_path|$ PYTHONPATH=$PYTHONPATH:./sample_module python3 ./main_module/main_file.py
      1
      self printing
      =======================================================================
      ➜  random_path|$ tree .
      .
      ├── main_module
      │   └── main_file.py
      └── sample_module
          ├── __pycache__
          │   └── sample_file_to_be_imported.cpython-36.pyc
          └── sample_file_to_be_imported.py
      3 directories, 3 files
      

      编辑01:@ felipe-rubin答案不起作用:

      ➜  random_path|$ cat ./main_module/main_file.py 
      from sample_file_to_be_imported import func1, Class01
      
      print(func1())
      
      x = Class01()
      
      x.cprint()
      =======================================================================
      ➜  random_path|$ cat ./sample_module/sample_file_to_be_imported.py 
      def func1():
          return 1
      
      class Class01():
          def cprint(self):
              print('self printing')
      

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用scalac编译.scala文件:

Linux/OSX: scalac mypackage/Example.scala
Windows:   scalac mypackage\Example.scala

以上内容应生成.class文件(或更多)。

假设该文件包含一个名为 Example 的类,您可以将其导入其他地方,如下所示:

import mypackage.Example

在编译执行上述导入的其他文件时,您需要拥有' mypackage'在类路径中。使用 -cp 标志调用scalac时,可以将目录添加到类路径中:

Linux/OSX: scalac -cp .:path/to/folder/where/mypackage/is/located AnotherExample.scala
Windows:   scalac -cp .;path\to\folder\where\mypackage\is\located AnotherExample.scala

为更大的项目执行此操作变得复杂,在这种情况下,您可能需要使用构建工具(例如SBT)或IDE(例如IntelliJ Idea)来为您完成复杂的工作。

其他说明:

  • 如果您没有scalac,可以通过scala website('下载二进制文件'选项)获取它。
  • -cp 标志代表" classpath"。还有一个 -classpath 标志,它做同样的事情
  • 欢迎来到Scala:)

答案 1 :(得分:0)

我终于有了这个工作。感谢其他答案的宝贵意见。

我将每个路径,文件和对象的名称多样化为尽可能通用。这可能不遵循scala社区的指导原则,但却是我能找到的最明确的说明性帮助。项目布局:

文件布局

$ tree /tmp/scala_stack_exchange
/tmp/scala_stack_exchange
├── anotherpath
│   ├── file_defines_class.scala
│   └── some_package_name
│       ├── MyObj.class
│       └── MyObj$.class
└── path01
    └── myprogram.scala

3 directories, 4 files

我希望运行myprogram.scala,它应该导入file_defines_class.scala中定义的类。

<强>制备

编译要由其他模块导入的文件:

cd /tmp/scala_stack_exchange/anotherpath && scalac ./file_defines_class.scala

<强>执行

cd /tmp/scala_stack_exchange/path01 && scala -cp /tmp/scala_stack_exchange/anotherpath/ ./myprogram.scala

<强>结果

myobj time

文件内容

// /tmp/scala_stack_exchange/path01/myprogram.scala
import some_package_name.MyObj

val x = new MyObj(10)

x.time()
// /tmp/scala_stack_exchange/anotherpath/file_defines_class.scala
package some_package_name

object MyObj

case class MyObj(i: Int) {
def time(): Unit = println("myobj time")
}

感觉像魔术一样。然而,整个过程相当麻烦:/