在Julia中的一行中定义多个相同类型的变量?

时间:2016-05-14 17:16:00

标签: julia

在C ++中你可以写:

double x = 0.0, y = 0.0, z = 0.0;

而不是:

double x = 0.0; double y = 0.0; double z = 0.0;

定义三个相同类型的变量,在此示例中为double

在朱莉娅,类似的是:

x::Float64 = 0.0, y::Float64 = 0.0, z::Float64 = 0.0

是否有一个语法糖,就像上面的C ++一样,允许我省略三个类型说明符,当它们全部相同时只用一个替换它们?

注意:我知道我可以写

x = y = z = 0.0

让朱莉娅推断出这种类型。这不是我想要的。我想明确说明x,y,z的类型是常量。

2 个答案:

答案 0 :(得分:2)

实际上,以下内容并未将这些变量声明为Julia

中的变量
x::Float64, y::Float64, z::Float64

至少根据我的调查,您需要更多类似的内容:

local x::Float64 = zero(Float64)
local y::Float64 = zero(Float64)
local z::Float64 = zero(Float64)

这样做没有语法糖,AFAIK强迫特定类型在朱莉娅中并不常见或必要。

编辑:我应该更清楚,尤其是@dpsanders在下面评论之后,我觉得这不应该是在Julia中应该做的事情,尽管在有限的情况下类型断言可能对性能有用,但是使用它们你想要语法糖或者缩短代码的宏看起来像是过早优化的情况。

如果您真的想要这么做,可以编写一个宏来为您处理,如下所示:

macro dcl(T, args...)
    r = quote end
    for var in args
        push!(r.args, :( local $(esc(var))::$T = zero($T)) )
    end
    r
end

我确定一些朱利安有更多的宏 - " fu"比我做得更好,但在我的测试中,它似乎确实有效,即:

@dcl(Float64, x, y, z)

编辑:以下表明语法根本没有声明任何变量,只是约束从封闭范围中取出的变量类型:

julia> function testdecl()
           x::Float64, y::Int, z::String
           println(x, y, z)
       end
testdecl (generic function with 1 method)

julia> @code_warntype testdecl()
Variables:
  #self#::#testdecl

Body:
  begin  # REPL[107], line 2:
      (Core.typeassert)(Main.x,Main.Float64)::Float64
      (Core.typeassert)(Main.y,Main.Int)::Int64
      (Core.typeassert)(Main.z,Main.String)::String # REPL[107], line 4:
      return (Main.println)(Main.x,Main.y,Main.z)::Any
  end::Any

我想知道这里是否还有错误,请看以下内容:

julia> function testdcl()
           println(y)
           x::Float64, y::String
           x = 1
           println(x)
       end
testdcl (generic function with 1 method)

julia> y = 1.234
1.234

julia> testdcl()
1.234
ERROR: UndefVarError: x not defined
 in testdcl() at ./REPL[131]:2
 in eval(::Module, ::Any) at ./boot.jl:226

julia> @code_warntype testdcl()
Variables:
  #self#::#testdcl
  x::Union{}

Body:
  begin  # REPL[131], line 1:
      (Main.println)(Main.y)::Any # REPL[131], line 2:
      (Core.tuple)((Core.typeassert)(x::Union{},Main.Float64)::Union{},(Core.typeassert)(Main.y,Main.String)::String)::Union{}
  end::Union{}

答案 1 :(得分:1)

变量在Julia中没有类型。 有类型。

但是您可以使用const来确保不能为变量分配不同类型的值。这是一种方式,虽然它可能不是最简洁的:

const a, b, c = (zeros(Float64, 3)...)

编辑:但你确定这是你真正想要的吗? Julia是一种动态类型语言,你所要求的是你通常用静态类型语言做的事情。