我想这个命名可能有历史原因,其他语言也有相似的功能,但在我看来参数总是在C#中有一个名字.争论是未命名的.或者是否有一个特殊原因选择这个术语?
我希望在ironpython中加载.net dll.
但是.net dll中的一个静态函数有一些Named和Optional Arguments.
比如,画(重量:w,高度:h,面积= 1)
我只能使用完整的参数吗?
我们目前正在使用.NET 3.5,部分应用程序使用动态调用(使用MethodBase.Invoke)
我想知道是否可以在命名参数(在.NET 4中)与动态调用混合,执行类似于:
// Dictionary that holds parameter name --> object mapping
var parameters = new Dictionary<string, object>();
// Add parameters ....
// Invoke where each parameter will match the one from the method signature.
methodInfo.Invoke(obj, parameters);
Run Code Online (Sandbox Code Playgroud)
是否有任何API允许此选项开箱即用?如果没有,是否有可能开发出一些解决方案来执行此操作?
编辑:
重新思考这个问题,听起来类似于编译器实际上需要匹配基于参数列表的方法调用.也许有一些编译器API(或新的Roslyn项目)可以轻松地做到这一点?(没有自己编码,可能容易出错).
可能重复:
Python中的"最小惊讶":可变默认参数
我有这个代码
class Test(object):
def __init__(self, var1=[]):
self._var1 = var1
t1 = Test()
t2 = Test()
t1._var1.append([1])
print t2._var1
Run Code Online (Sandbox Code Playgroud)
我得到"[[1]]"作为结果.很明显,t1._var1和t2._var1正在寻址相同的列表.如果我放
t3 = Test()
print t3._var1
Run Code Online (Sandbox Code Playgroud)
然后我也得到"[[1]]".所以var1 = []似乎永久地将var1绑定到某个列表.我试着复制清单,
def __init__(self, var1=copy([])):
Run Code Online (Sandbox Code Playgroud)
但是得到了相同的结果,因此在调用init之前,似乎会计算命名参数的表达式,并且它只给var1一个空列表的副本,然后在实例之间共享.
那么如何使用[]作为命名参数的默认值?
是否可以将类型为'stored_procedure'的命名参数传递给dbms_scheduler作业?我已经尝试过这种方式:
-- 1) example dummy procdure
CREATE OR REPLACE PROCEDURE my_test_proc (
param1 IN NVARCHAR2,
param2 IN NUMBER,
param3 IN NUMBER
) IS
BEGIN
-- ...
END;
-- 2)Example dummy job:
BEGIN
dbms_scheduler.create_job(
job_name => 'my_test_job'
,job_type => 'STORED_PROCEDURE'
,job_action => 'my_test_proc'
,start_date => sysdate
,number_of_arguments => 3
,enabled => FALSE
,auto_drop =>FALSE
);
END;
-- 3)Set named param value:
BEGIN
dbms_scheduler.set_job_argument_value(
job_name => 'my_test_job'
,argument_name => 'param1'
,argument_value => 'some value'
);
END;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:ORA
-27484:没有程序的作业不支持参数名称。ORA-06512:在“ SYS.DBMS_ISCHED”处,第207行ORA-06512:在“ SYS.DBMS_SCHEDULER”中,行602 ORA-06512:在第2行中
我通过使用arguments_position设置成功使用set_job_argument_value设置了参数值。但是在某些情况下,我需要运行存储过程,而我只需要为其设置某些参数,而这是行不通的。有没有一种方法可以将命名参数传递给计划程序作业运行的存储过程?
plsql stored-procedures named-parameters oracle10g dbms-scheduler
我编写了一种方法来检索具有NamedParameterJdbcTemplate的条目列表:
public final Map<K,V> findAll(final Collection<K> keys) {
if (keys == null) {
return null;
}
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("ids", keys);
List<V> values = new NamedParameterJdbcTemplate(datasource).query("select * from TABLE where id in ( :ids )", parameters, mapper);
Map<K,V> results = new HashMap<K, V>();
for (V v : values) {
results.put((K) v.getId(), v);
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
但这仅在键为简单类型时有效。我无法使用像这样的主键来工作:
public class CompositeKey implements Serializable {
private long field1;
private long field2;
}
Run Code Online (Sandbox Code Playgroud)
如何使用复合键使我的findAll()方法工作?
在MSVC和gcc(GCC)4.8.3 20140911上,以下编译和运行正常:
#include <stdio.h>
int func(int a, int b){
return 0;
}
int main(void){
int (*funcPointer)(int a, int b);
funcPointer = func;
printf("funcPointer = %p\n", funcPointer);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这样的行为是定义明确的,还是非标准的,并且函数指针类型具有命名参数(即名称及其参数列表中的类型)实际上是非法的?
你能在普通的oracle函数中使用命名参数,例如REGEXP_REPLACE吗?我喜欢命名参数表示法,并总是使用它来调用自定义的PL/SQL代码片段,但以下似乎不起作用:
select regexp_replace( string => 'TechOnTheNet'
, pattern => 'a|e|i|o|u'
, replacement_string => 'Z'
, start_position => 1
, nth_appearance => 2
, match_parameter => 'i') from dual;
Run Code Online (Sandbox Code Playgroud) 使用命名参数调用 aDictionary的Add()方法在 F# 中有效。
let d = Dictionary<string, obj>()
d.Add(key = "five", value = 5)
let d2= Dictionary<obj, obj>()
d2.Add(key = "five", value = 5)
d2.Add(key = 5, value = 5)
Run Code Online (Sandbox Code Playgroud)
在 Polly 的Contextclass 中,有一个类似的Add()方法,有 2 个重载:
Add(key: obj, value: obj) : unit
Add(key: string, value: obj) : unit
Run Code Online (Sandbox Code Playgroud)
我可以通过以下所有方式使用它:
let c = Polly.Context()
c.Add("five", 5)
c.Add(5, 5)
c.Add(key = 5, value = 5)
Run Code Online (Sandbox Code Playgroud)
但不是这样,它说它无法在重载之间解析并且需要类型注释。
c.Add(key = "five", value = 5)
Run Code Online (Sandbox Code Playgroud)
为什么会这样,我该如何解决?
我已经实现了一个有序字典,它有两个下标。第一个用于索引(始终为 类型Int),第二个用于可变类型的键keyType。
这一切都工作正常,直到keyTypeis Int,因为现在下标显然不明确。
“下标”的使用不明确
因此,为了解决歧义,我尝试简单地key:为该值添加一个名称标签,就像普通函数参数一样,但这导致key: keyType被视为我的参数类型,从而导致此错误:
无法使用“(key: Int)”类型的索引为“OrderedDictionary”类型的值添加下标
错误消息对我来说非常清楚,但我不知道如何解决歧义。现在我正在使用一个函数insert(for:value:)。
这是 OrderedDictionary 类:
import Foundation
struct OrderedDictionary<keyType: Hashable, valueType>: Sequence {
typealias Element = (keyType, valueType)
let comparator: ((Element, Element) -> (Bool))?
var keys = [keyType]()
var values = [keyType:valueType]()
var count: Int {
get {
return keys.count
}
}
public struct Iterator: IteratorProtocol {
let parent: OrderedDictionary
var position: Int = 0
init(parent: OrderedDictionary) {
self.parent …Run Code Online (Sandbox Code Playgroud) named-parameters ×10
.net ×2
arguments ×1
c ×1
c# ×1
c#-4.0 ×1
constructor ×1
f# ×1
gcc ×1
ironpython ×1
java ×1
jdbctemplate ×1
oracle ×1
oracle10g ×1
parameters ×1
plsql ×1
polly ×1
python ×1
reflection ×1
roslyn ×1
spring-data ×1
sql ×1
swift ×1
terminology ×1
visual-c++ ×1