是否可以将函数指针作为参数传递给C中的函数?
如果是这样,我将如何声明和定义一个以函数指针作为参数的函数?
我想编写调用两种功能:plot()和legend(),这将是理想的,如果用户可以指定一些额外的参数,然后可通过要么通过plot()或legend().我知道我可以使用...以下两种函数之一实现此目的:
foo.plot <- function(x,y,...) {
plot(x,y,...)
legend("bottomleft", "bar", pch=1)
}
foo.plot(1,1, xaxt = "n")
Run Code Online (Sandbox Code Playgroud)
这传递xaxt = "n"给情节.但是有没有办法title = "legend"在legend()没有预先指定函数头中的参数的情况下将eg传递给调用?
从接受的答案中更新:我认为VitoshKa的方式是实现我想要的最优雅的方式.但是,我必须解决一些小问题,直到它按照我想要的方式工作.
首先,我检查了我要传递给legend哪个参数以及哪个参数plot.为此目的的第一步是查看哪些参数legend是独特的,legend而不是绘图和/或参数的一部分:
legend.args <- names(formals(legend))
plot.args <- c(names(formals(plot.default)), names(par()))
dput(legend.args[!(legend.args %in% plot.args)])
Run Code Online (Sandbox Code Playgroud)
我dput()在这里使用,因为该行plot.args <- c(names(formals(plot.default)), names(par()))总是调用一个我不想要的新空图.所以,我使用dput了以下函数的输出.
接下来,我不得不处理重叠的参数(通过它们获取dput(largs.all[(largs.all %in% pargs.all)])).对于一些这是微不足道的(例如x,y)等获得通过这两个功能(例如,pch).但是,在我的实际应用程序中,我甚至使用其他策略(例如,不同的变量名称adj,但在此示例中未实现).
最后, …
据我所知,在Postgres pure中,您可以将整数数组传递给函数,但.NET数据提供程序Npgsql不支持这种情况.
我目前有一个DbCommand,我在其中加载对存储过程的调用,添加参数并执行标量以获取用于填充对象的Id.
现在需要将n个整数作为参数.这些用于创建子记录,将新创建的记录通过它的id链接到整数参数.
理想情况下,我不必为每个整数在我的DbCommand上进行多次ExecuteNonQuery调用,因此我将构建一个csv字符串作为将在数据库端拆分的参数.
我通常生活在使用Db抽象的LINQ 2 SQL中,使用手动数据访问来处理这个项目它只是变得有点脏,人们通常如何将这些参数传递给postgres?
如何将一个shell脚本的所有参数传递给另一个?我已经尝试了$*,但正如我所料,如果你引用了参数,那就不行了.
例:
$ cat script1.sh
#! /bin/sh
./script2.sh $*
$ cat script2.sh
#! /bin/sh
echo $1
echo $2
echo $3
$ script1.sh apple "pear orange" banana
apple
pear
orange
Run Code Online (Sandbox Code Playgroud)
我希望它打印出来:
apple
pear orange
banana
Run Code Online (Sandbox Code Playgroud) 我最近了解到,您可以使用带有fallthrough的简洁switch语句在Javascript中设置默认参数值:
function myFunc(arg1, arg2, arg3) {
//replace unpassed arguments with their defaults:
switch (arguments.length) {
case 0 : arg1 = "default1";
case 1 : arg2 = "default2";
case 2 : arg3 = "default3";
}
}
Run Code Online (Sandbox Code Playgroud)
我已经成长为喜欢它,因为它不仅非常短,而且它也基于实际传递的参数而工作,而不依赖于一个特殊的值类(null,falsy等)作为占位符,就像在更传统的版本:
function myFunc(arg1, arg2, arg3){
//replace falsy arguments with their defaults:
arg1 = arg1 || "default1";
arg2 = arg2 || "default2";
arg3 = arg3 || "default3";
}
Run Code Online (Sandbox Code Playgroud)
我看到使用开关的版本之后我的初衷是我应该考虑在||版本上"默认"使用它.
开关虽然不会长得多,但它具有更加"稳健"的优点,因为它不关心参数的类型.在一般情况下,每当我必须使用默认参数创建函数时,不必担心所有伪值('',0,null,false ...)会发生什么,这听起来是个好主意.
然后,我会保留arg = arg || x实际情况,我想检查真实性,而不是将其重新用作参数默认的一般规则.
但是,当我进行代码搜索时,我发现这种模式的例子很少,所以我不得不戴上我的怀疑帽.为什么我没有找到这个成语的更多例子? …
我想创建一个Listener类
class Listener {
var $listeners = array();
public function add(callable $function) {
$this->listeners[] = $function;
}
public function fire() {
foreach($this->listeners as $function) {
call_user_func($function);
}
}
}
class Foo {
public function __construct($listener) {
$listener->add($this->bar);
}
public function bar() {
echo 'bar';
}
}
$listener = new Listener();
$foo = new Foo($listener);
Run Code Online (Sandbox Code Playgroud)
但是此代码失败并出现此错误:
注意:未定义的属性:第18行的index.php中的Foo :: $ bar
可捕获的致命错误:传递给Listener :: add()的参数1必须是可调用的,给定null,在第18行的index.php中调用,在第5行定义index.php
我究竟做错了什么?
在Python中,我们有星号(或"*"或"unpack")运算符,它允许我们解压缩列表以方便用于传递位置参数.例如:
range(3, 6)
args = [3, 6]
# invokes range(3, 6)
range(*args)
Run Code Online (Sandbox Code Playgroud)
在这个特定的例子中,它不会节省太多的输入,因为range只需要两个参数.但你可以想象,如果有更多的参数range,或者args是从输入源读取,从另一个函数返回等等,那么这可能会派上用场.
在Scala中,我找不到相应的东西.请考虑在Scala交互式会话中运行以下命令:
case class ThreeValues(one: String, two: String, three: String)
//works fine
val x = ThreeValues("1","2","3")
val argList = List("one","two","three")
//also works
val y = ThreeValues(argList(0), argList(1), argList(2))
//doesn't work, obviously
val z = ThreeValues(*argList)
Run Code Online (Sandbox Code Playgroud)
除了使用的方法之外,还有更简洁的方法val y吗?
我想在单击按钮时将参数传递给函数.我应该在这一行添加什么,button.connect(button, QtCore.SIGNAL('clicked()'), calluser(name))以便将值传递给函数:
def calluser(name):
print name
def Qbutton():
button = QtGui.QPushButton("button",widget)
name = "user"
button.setGeometry(100,100, 60, 35)
button.connect(button, QtCore.SIGNAL('clicked()'), calluser(name))
Run Code Online (Sandbox Code Playgroud)
还有一件事,按钮将使用for循环生成; 所以name价值会有所不同.所以我想用按钮附上每个名字.我在Pytk中做了同样的事情,使用for循环并在单击时调用参数基函数.
我正在研究Django 1.6中的通知应用程序,我想将其他参数传递给Django信号,例如post_save.我尝试使用functools的部分但没有运气.
from functools import partial
post_save.connect(
receiver=partial(notify,
fragment_name="categories_index"),
sender=nt.get_model(),
dispatch_uid=nt.sender
)
Run Code Online (Sandbox Code Playgroud)
notifyfunction有一个关键字参数fragment_name,我希望在我的信号中默认传递.
有什么建议?
有没有办法创建一个对象数组作为构造函数或方法的一部分?我真的不确定怎么说这个,所以我举了一个例子.我有一个枚举,其中一个字段是数字数组.这是我尝试过的:
public enum KeyboardStuff {
QWERTY(1, {0.5f, 1.3f, 23.1f}, 6);
DVORAK(5, {0.1f, 0.2f, 4.3f, 1.1f}, 91);
CHEROKEE(2, {22.0f}, 11);
private int number, thingy;
private float[] theArray;
private KeyboardStuff(int i, float[] anArray, int j) {
// do things
}
}
Run Code Online (Sandbox Code Playgroud)
编译器说括号{}无效,应该删除.有没有一种方法可以将数组作为参数传递而不事先创建对象数组?
argument-passing ×10
arguments ×2
arrays ×2
function ×2
python ×2
c ×1
class ×1
django ×1
java ×1
javascript ×1
methods ×1
parameters ×1
php ×1
postgresql ×1
pyqt4 ×1
r ×1
scala ×1
shell ×1
signals ×1