我已经检查了维基百科,然后用Google搜索,但我还是无法理解ALGOL 60中的名称传递方式.
在python中我们可以这样做:
def myFun1(one = '1', two = '2'):
...
Run Code Online (Sandbox Code Playgroud)
然后我们可以调用函数并按名称传递参数:
myFun1(two = 'two', one = 'one')
Run Code Online (Sandbox Code Playgroud)
此外,我们可以这样做:
def myFun2(**kwargs):
print kwargs.get('one', 'nothing here')
myFun2(one='one')
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否可以将两种方法结合起来:
def myFun3(name, lname, **other_info):
...
myFun3(lname='Someone', name='myName', city='cityName', otherInfo='blah')
Run Code Online (Sandbox Code Playgroud)
一般来说,我们可以做什么组合?
谢谢,对不起我的愚蠢问题.
让我们说我认识一个不熟悉C++的人.他没有绕过指针(正确地说是这样),但他拒绝通过引用传递.他总是使用传值.原因是他觉得"通过引用传递物体是一种破碎设计的标志".
该程序是一个小型图形程序,大多数传递的问题是数学Vector(3元组)对象.有一些大的控制器对象,但没有比这复杂.
我发现很难找到一个反对只使用堆栈的杀手论点.
我认为按值传递对于诸如向量之类的小对象是好的,但即使这样,代码中也会发生许多不必要的复制.按值传递大型对象显然是浪费,很可能不是您想要的功能.
在专业方面,我相信堆栈在分配/解除分配内存方面更快,并且具有恒定的分配时间.
我能想到的唯一主要论点是堆栈可能会溢出,但我猜这是不可能发生的?是否有任何其他参数反对仅使用堆栈/传递值而不是通过引用传递?
鉴于此Scala代码:
object test {
def byval(a: Int) = println("Int")
def byval(a: Long) = println("Long")
def byname(a: => Int) = println("=> Int")
def byname(a: => Long) = println("=> Long")
def main(args: Array[String]) {
byval(5)
byname(5)
}
}
Run Code Online (Sandbox Code Playgroud)
调用byval(5)正确编译,但byname无法编译:
ambiguous reference to overloaded definition
Run Code Online (Sandbox Code Playgroud)
为什么?我希望在重载方面观察相同的by-value和by-name参数行为......如何修复它?
我试图理解按引用,值和名称调用之间的概念差异.
所以我有以下伪代码:
foo(a, b, c)
{
b =b++;
a = a++;
c = a + b*10
}
X=1;
Y=2;
Z=3;
foo(X, Y+2, Z);
Run Code Online (Sandbox Code Playgroud)
如果a,b和c都是通过引用调用的话,foo调用后的X,Y和Z是什么?如果a,b和c是按值调用/结果?如果a,b和c是名字?
另一种情况:
X=1;
Y=2;
Z=3;
foo(X, Y+2, X);
Run Code Online (Sandbox Code Playgroud)
我正在努力开始研究即将到来的决赛,这似乎是一个很好的评论问题.名字传递对我来说绝对是最陌生的.
在另一个问题中,我最终得到了一个类型的值A => => B.这是什么意思?
我总是被理解=> A为实际上并不是一个类型,但是可以声明一个参数可以用于逐个语调的语义.但如果它不是一种类型,那A => => B意味着什么?
想象一下,我有以下类定义:
class Foo[T]
Run Code Online (Sandbox Code Playgroud)
我想做以下事情
def bar(x:Foo[ =>Int ]):Int = ???
Run Code Online (Sandbox Code Playgroud)
但编译器失败,"此处不允许使用by-name参数类型"
如何使用通配名类型作为通用方法的类型参数?
在开发DSL时,限制隐式变量范围的最简洁方法是什么,同时隐藏这样一个隐式变量定义的事实?
举个例子,这是理想的行为......
object External
{
def funNeedingValue(implicit a : String)
{
println(a)
}
}
object Main extends App
{
useValue("Hi") {
// Implicit string "Hi" is only defined in this block
External.funNeedingValue // Prints "Hi"
}
External.funNeedingValue // Compilation error: No implicit String defined
}
Run Code Online (Sandbox Code Playgroud)
以下是关闭,但没有所有所需的属性......
// The following works, but does not hide the fact that there is an implicit
// variable defined.
object Main extends App
{
{
implicit val implicitValue = "Hi"
External.funNeedingValue // Prints "Hi"
} …Run Code Online (Sandbox Code Playgroud) 我正在阅读"Scala中的函数编程"一书,并且遇到了一个我不完全理解的例子.
在关于严格/懒惰的章节中,作者描述了Streams的构造,并且代码如下:
sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]
object Stream {
def cons[A](hd: => A, tl: => Stream[A]) : Stream[A] = {
lazy val head = hd
lazy val tail = tl
Cons(() => head, () => tail)
}
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是在smart constructor(cons)中,它调用Conscase类的构造函数.用于传递head和tailval 的特定语法对我来说没有意义.为什么不像这样调用构造函数:
Cons(head, tail)
Run Code Online (Sandbox Code Playgroud)
据我所知,它使用的语法是强制创建两个只返回head和tailval的Function0对象.这与仅仅传递head和tail …
我定义了一个treeNode创建节点的方法,它可以有子节点.简化的代码是:
def treeNode(text:String) (children: => Any) {
val b = new TreeNode(text)
children
}
Run Code Online (Sandbox Code Playgroud)
当我使用这种方法时,我必须写:
treeNode("aaa") {
treeNode("bbb") {}
treeNode("ccc") {}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到他们没有子节点的叶节点,但它们必须有一个空块{}.
有没有办法给参数children: => Any一个默认的do-nothing值,我可以把代码编写为:
treeNode("aaa") {
treeNode("bbb")
treeNode("ccc")
}
Run Code Online (Sandbox Code Playgroud)
帮助〜