我感兴趣的是传递一个简单函数的值(在下面的最小示例中为2)。我的最小示例显示,宏比函数快得多。这是对的,还是我做错了?
using BenchmarkTools
macro func!(arg)
arg = eval(arg)
for i in 1:length(arg)
arg[i] = 2
end
return nothing
end
function func!(arg)
for i in 1:length(arg)
arg[i] = 2
end
return nothing
end
x = ones
试图理解参数类型和内部方法可用的new函数。手动声明“内部构造函数可用的特殊函数,它创建了一个新的类型对象”。请参阅手册中关于新 的部分和关于内部构造器方法的手册一节。
考虑一个用于计算x之和的内部方法,其中x可以是向量或元组,并给出参数类型T。想要的一件自然的事情是,x的元素的类型由它们的和s继承。我似乎不需要new了,对吧?
struct M{T}
x::T
s
function M(x)
s = sum(x)
x,s
end
end
julia> M([1,2,3])
([1, 2, 3], 6)
julia&g
我尝试将一个字符串添加到数组中,如下所示: arry = String[]
append!(arry, "test") 但是我得到了以下错误: Cannot `convert` an object of type Char to an object of type String 为什么我在添加字符串而不是字符时会出现这个错误? (为了其他Julia新手的利益,在下面发布我自己的答案-任何有更多有用提示的人请加入!)
为什么在这种情况下方法定义的顺序会有所不同?在我看来,这没有多大意义。
julia> f() = 1
f (generic function with 1 method)
julia> f(;arg) = 1
f (generic function with 1 method)
julia> f()
ERROR: UndefKeywordError: keyword argument arg not assigned
Stacktrace:
[1] f() at ./REPL[2]:1
[2] top-level scope at REPL[3]:1
julia&g
假设我有以下类型:
type Foo
a::Int64
b::Int64
end
我可以用
bar = Foo(1,2)
这里有使用关键字的方法吗,因为在上面我必须记住a是第一位的,而b是第二位的。就像这样:
bar = Foo(a=1, b=2)
编辑
如果从函数调用的解决方案,则无法工作:
#!/usr/bin/env julia
type Foo
a::Float64
b::Float64
end
function main()
Foo(;a=1, b=2.0) = Foo(a,b)
bar = Foo(a=1, b=2.0)
我是朱莉娅的新手,我试着在语言层面上理解是什么。在语法级别上,它看起来像一个正常的函数,但是它在对待参数的方式上显然不一样:
注意,参数类型元组必须是文字元组,而不是元组值变量或表达式。
此外,如果我计算一个绑定到Julia中的函数的变量,我会得到以下内容
julia> max
max (generic function with 15 methods)
但是如果我对ccall做同样的尝试
julia> ccall
ERROR: syntax: invalid "ccall" syntax
显然,ccall是一种特殊的语法,但它也不是宏(没有@前缀,无效的宏
在R中,从任何工作目录开始,我都能做到
setwd("~/Desktop")
这与我的linux发行版在命令行解释cd的方式是一致的。但是Julia似乎不能识别~/符号:
julia> cd("~/Desktop")
ERROR: chdir ~/Desktop: No such file or directory
in systemerror at error.jl:38
in cd at file.jl:13
这是一个bug吗?
问题很简单,但我对ColorGradient类型的工作方式不是很熟悉,所以我想在这里问一下。 假设我有一些x, y数据,我想要用scatter(x,y)以标准方式绘制这些数据,并且我想根据由颜色渐变确定的颜色映射(参见下面的代码),用点的独特颜色给这些点着色: using Plots
C(g::ColorGradient) = RGB[g[z] for z=LinRange(0,1,30)]
g = :inferno (来源:https://github.com/JuliaPlots/ExamplePlots.jl/blob/master/notebooks/cgrad.ipynb) 如何设
假设我想编写一个函数,使所有bools都是假的:
function true_to_false!(boolean::Bool)
boolean = false
end
为什么我不能用它来改变另一个函数的值呢?例如:
function make_x_false()
x = true
true_to_false!(x)
return x
end
返回true。
当然,也有一些解决办法,比如
function make_x_false()
x = true
x = true_to_false!(x)
end
和
function make_x_fal
我有一个脚本main.jl,它打印一个简单的"Hello“字符串:
println("Hello world!")
但是,当试图像这样在终端上运行脚本时:
julia> main.jl
我知道错误:
ERROR: type #main has no field jl
我可以在网上找到的所有信息都建议像我运行脚本那样调用脚本。我已经保证我在正确的目录中--我做错了什么?
如果我有像f(args...; kwargs...)这样的函数签名,那么如何从kwargs中获得特定的关键字呢?天真地键入kwargs.x是行不通的:
julia> f(args...; kwargs...) = kwargs.x
f (generic function with 1 method)
julia> f(x=1)
ERROR: type Pairs has no field x
Stacktrace:
[1] getproperty(::Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:x,)
我经常想通过Julia中的矩阵来迭代逐行或按列排列,所以我创建了一对函数来帮助:
function cols(x::Matrix)
function _it()
for ii in 1:size(x,2)
produce(x[:,ii])
end
end
Task(_it)
end
function rows(x::Matrix)
function _it()
for ii in 1:size(x,1)
produce(x[ii,:])
end
所以我开始用朱莉娅,我想知道你是否能在一个字符串中找到一个字符。例如:
x = "hello."
寻找一个. (如果它在那里)
移除.
x = "hello"
我的程序基于答案(现在生效!):
# hello.jl
# --- Greeting ---
println("Hello!")
println("How are you?")
# --- Input ---
x = readline()
# --- Put the characters in the ' ' for use later ---
remov
下面是一个示例: def(f::Function) = f
f1 = def() do x
x
end
f2 = def() do x, y
x, y
end
f3 = def() do x, y; z # this syntax is accepted
x, y, z
end
f1(1)
f2(1, 2)
f3(1, 2, z=3) # ERROR: LoadError: function #13 does not accept keyword arguments 下面的例子不是我的实际用例,但它说明了这个问题。我应该如何处理do-block中的kwargs