我在构造函数上使用Scala 2.8默认参数,出于Java兼容性原因,我想要一个使用默认参数的无参数构造函数.
这不是出于非常明智的原因:
class MyClass(field1: String = "foo", field2: String = "bar") {
def this() = {
this() // <-- Does not compile, but how do I not duplicate the defaults?
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何我想念的东西.任何不需要重复参数默认值的想法?
谢谢!
今天我在构造函数中创建了一个默认参数值.
public SomeClass (String something = String.Empty)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨道.
"something"的默认参数值必须是编译时常量.
我的印象是String类上的Empty是编译时常量.
.field public static initonly string Empty
Run Code Online (Sandbox Code Playgroud)
我是否理解编译时常量的含义,还是我需要接受的更为古怪?
我在一个函数中更改了一个paremeter,使用模板接受任何类型的对象,但我不能将它与其他默认参数一起使用,是否有我遗漏的东西?
#include <string>
#include <iostream>
class MyClass {
public:
std::wstring msg = L"hey";
MyClass(){};
};
class MyClass2{
public:
template<class T> MyClass2(T* t, int i);
};
template<class T>
MyClass2::MyClass2(T* t,int i=0){ std::wcout << t->msg << std::endl; }
int main(int argc, char **argv)
{
MyClass mc;
MyClass2 mc2(&mc);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
practice.cpp:16:32: error: redeclaration of 'MyClass2::MyClass2(T*, int)' may not have default arguments [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
我认为在模板中不使用默认值是合理的,但其他参数是否有原因?
我是ES6 Javascript的新手,这意味着我正在探索它.我喜欢ES6中的箭头功能和默认参数功能,这在下面的站点中提到过.
http://es6-features.org/#ExpressionBodies
http://es6-features.org/#DefaultParameterValues
下面是我的ES6代码片段,我已经测试了这个Chrome 47.我正在尝试为我的箭头函数提供默认参数值,该函数当前正在抛出错误
<script type="text/javascript">
'use strict';
var greet = (name = 'Venkat') => (console.log('Hi ' + name + '!'));
greet(); // expected output: Venkat
greet('Venkatraman'); // expected output: Venkatraman
</script>
Run Code Online (Sandbox Code Playgroud)
让我知道它是否可能,如果是这样,用解决方案解释我在这里做错了什么.
在fortran中,我们可以定义默认参数.但是,如果不存在可选参数,则也不能设置它.当使用参数作为具有默认值的关键字参数时,这会导致类似的笨拙结构
PROGRAM PDEFAULT
CALL SUB
CALL SUB(3)
CONTAINS
SUBROUTINE SUB(VAL)
INTEGER, OPTIONAL :: VAL
INTEGER :: AVAL ! short for "actual val"
IF(PRESENT(VAL)) THEN
AVAL = VAL
ELSE
AVAL = -1 ! default value
END IF
WRITE(*,'("AVAL is ", I0)') AVAL
END SUBROUTINE SUB
END PROGRAM PDEFAULT
Run Code Online (Sandbox Code Playgroud)
就个人而言,我经常遇到意外打字的问题VAL而不是AVAL,即接口中的变量名之间的断开,以及代码中使用的初始化值可能引入运行时错误 - 更不用说这种初始化方式相当冗长.
是否有一些更优雅的方式使用具有默认值的可选参数?
示例写一些类似的东西会更自然
IF(NOT(PRESENT(VAL))) VAL = -1
Run Code Online (Sandbox Code Playgroud)
因为它避免了VALvs AVAL混乱.但它无效,大概是因为Fortran通过引用传递参数,因此如果语句中VAL不存在,则CALL不会与内存关联VAL并VAL = -1导致段错误.
fortran optional-parameters optional-arguments default-parameters default-arguments
enum class E {
One,
Two
};
void foo(E value = decltype(value)::One) {
}
Run Code Online (Sandbox Code Playgroud)
它可以用Clang(3.9)编译,但不能用GCC 6.1编译:value was not declared in this scope.
什么编译器是对的?
我试图弄清楚是否有可能通过解构处理多个级别的默认参数.由于用文字解释起来并不容易,这是一个循序渐进的例子......
解构这个对象很简单:
let obj = {
foo: 'Foo',
bar: 'Bar'
};
Run Code Online (Sandbox Code Playgroud)
随着{foo = 'Foo', bar = 'Bar'} = {}在函数签名,如果没有当函数被调用时传入的参数的对象将被创建.如果传递了一个对象但是引用了一些属性undefined,则它们将被默认值替换.这段代码工作正常:
function fn1({foo = 'Foo', bar = 'Bar'} = {}) {
console.log(foo, bar);
}
// OK
fn1(); // Foo Bar
fn1({foo: 'Quux'}); // Quux Bar
fn1({bar: 'Quux'}); // Foo Quux
fn1({foo: 'Quux', bar: 'Quux'}); // Quux QuuxRun Code Online (Sandbox Code Playgroud)
解构这个对象更难:
let obj = {
foo: 'Foo',
bar: {
quux: 'Quux',
corge: 'Corge'
}
}; …Run Code Online (Sandbox Code Playgroud) javascript function destructuring default-parameters ecmascript-6
我今天正在尝试一些事情,并且遇到了我想要理解的行为.
var b = ({a = 1, b = 1, c = 1}) => a + b + c;
b(); // throws error.
Run Code Online (Sandbox Code Playgroud)
但如果它是这样定义的
var b = ({a = 1, b = 1, c = 1} = 0) => a + b + c;
b() // returns 3
b([]) // returns 3
Run Code Online (Sandbox Code Playgroud)
这不应该是一个错误吗?零在某种程度上成为了一个对象吗?它在某种程度上等同于以下?
var b = ({a = 1, b = 1, c = 1} = {}) => a + b + c; // this is possible I guess.
Run Code Online (Sandbox Code Playgroud)
我的问题不是常规的destrcuturing和default …
我有类型的功能
virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger) = 0;
Run Code Online (Sandbox Code Playgroud)
我想用NULL指针传递一个默认参数,如:
virtual void foo(bla, bla, bla, std::shared_ptr<LoggerInterface> logger = NULL) = 0;
Run Code Online (Sandbox Code Playgroud)
所以在实现中,如果logger是NULL我什么都不做,否则我使用记录器.
我试图找一个解决方案,但找不到..
UPD:重复声明是无关紧要的,我问的是默认的NULL参数.
gcc 4.4有可能不支持nullptr吗?
我需要将可为空参数传递给仅接受不可为空对象但定义了默认值的函数。
目前我正在使用 let:
fun myFun(a:String = "qqq"): Whatever {...}
val myString:String? = getNullableString()
val myFunResult = myString.?let{myFun(it)}?:myFun()
Run Code Online (Sandbox Code Playgroud)
这是很冗长的,并且当有多个可选参数时就不可能了。我需要类似的东西
val myFunResult = myFun(myString?:default)
Run Code Online (Sandbox Code Playgroud)
有没有一种实用的方法可以做到这一点?
c++ ×3
javascript ×3
ecmascript-6 ×2
.net ×1
c++11 ×1
constructor ×1
fortran ×1
function ×1
kotlin ×1
parameters ×1
scala ×1
shared-ptr ×1
string ×1
templates ×1