从这个问题我们知道了如何使用三元运算符来输出条件文本:Is there a Twigshorthandsyntax foroutputingconditionaltext
例子:
{{ foo ? 'yes' : 'no' }}
Run Code Online (Sandbox Code Playgroud)
我们如何使用三元运算符有条件地设置变量,而不直接输出它?
PureScript 有条件三元运算符吗?
如果没有,是否可以使用其他语言结构来模拟?
这是我想要实现的:
public static void foo()
{
// Local function
int? parseAppliedAmountTernary( decimal? d ) {
d.HasValue ? return Convert.ToInt32( Math.Round(d.Value, 0) ) : return null;
}
// The rest of foo...
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到编译错误。这种语法可能吗?我使用的是 Visual Studio 2019、.NET Framework 4,(当前)相当于 C# 7.3。
注意 - 我只是想弄清楚语法......任何关于代码“可读性”或其他美学的哲学讨论虽然有趣,但都不是重点。:)
代码示例(使用 Roslyn 4.0) https://dotnetfiddle.net/TlDY9c
我不是专家,但我确实喜欢学习和理解。考虑到这一点,我在 Arduino IDE 中编写了以下内容:
lockout[idx] ? bulb[idx].off() : bulb[idx].on();
Run Code Online (Sandbox Code Playgroud)
替换这个:
if (lockout[idx]) bulb[idx].off(); else bulb[idx].on();
Run Code Online (Sandbox Code Playgroud)
lockout[]是 的数组bool,并且bulb[]是类的数组,其中 。off和.on方法。
我四处寻找示例,但从未见过?三元运算符的这种用法。我读过的内容似乎表明这不应该起作用。
但它确实可以编译。那么这实际上是合法的 C++ 吗?
有没有一种方法可以在不创建实用程序的情况下“分配和返回”?这是我的代码:
static int& do_work_(const int* p, int& result)
{
result = (*p) * 10;
return result;
}
template<typename T>
T& assign(const T* p, T& result)
{
result = *p;
return result;
}
int& do_work(const int* p, bool cond, int& result)
{
return cond ? do_work_(p, result) : assign(p, result);
}
Run Code Online (Sandbox Code Playgroud)
我可以do_work()在没有该assign()实用程序的情况下实施吗?
签名的原因do_work()是它很方便:
const int value=1;
int i, j;
if (do_work(&value, true, i) == do_work(&value, false, j)) {}
Run Code Online (Sandbox Code Playgroud) c++ return reference conditional-operator assignment-operator
foo如果我想在一个对象上调用函数thisThing(用 C# 术语来说,这称为“接收器”,所以我在这里也这样称呼它)并传递参数myStuff,我会这样做:
thisThing.foo(myStuff);
超级简单,没什么奇怪的正在这里进行。
如果我想将参数更改为yourStuffbool 值是否b为 false,我会这样做:
thisThing.foo(b ? myStuff : yourStuff);
同样非常简单,三元运算符的基本使用。
如果我想将接收器更改为otherThingif bis false,我会这样做:
(b ? thisThing : otherThing).foo(myStuff);
有点奇怪,你可能不会经常这样做,但这也没什么疯狂的。
但是如果我想将被调用的函数更改为barif bis false,我该怎么做呢?
我会这样想:
thisThing.(b ? foo : bar)(myStuff);
但是,当然,这是行不通的。
有没有一种简单、美观、高性能的方法来做到这一点,最好不要多余地指定任何东西?
可能需要做出一些妥协,但重点是不必重复接收者和参数。所以以下工作:
if (b)
{
thisThing.foo(myStuff);
}
else
{
thisThing.bar(myStuff);
}
Run Code Online (Sandbox Code Playgroud)
但你必须重复接收者和参数。想象一下,thisThing和myStuff是更复杂表达式的占位符。您可能希望首先将它们放入局部变量中,但这会对复制产生影响,并且如果您有很多参数,它就不会很好地发挥作用。
您也许可以将函数指针指向这些成员函数,然后执行类似的操作(b ? pointerToFoo : pointerToBar)(myStuff);,但是处理函数指针往往很混乱(想想函数重载),而且编译器似乎不会正确优化掉它。但我很高兴在这里被证明是错误的。
正如摘要所述。假设我想以三元运算符的方式解析ReturnFunction 。好吧,据我所知,只要我的函数返回几个值(ReturnThreeValues)被放置在ReturnFunction返回后的最后一个位置,如果三元运算符执行我认为的操作,则ReturnFunction应该返回它给出的三个值这里是预期的,但由于某种原因,即使 n == nil ,它也会不断返回ReturnOneValue的值(因为我在调用时没有包含它)。可以在这里看到并尝试:
<script src="//github.com/fengari-lua/fengari-web/releases/download/v0.1.4/fengari-web.js"></script>
<script type="application/lua">
function ReturnOneValue(t, n)
n = n or 1
return t[n]
end
function ReturnThreeValues(t)
return t[1], t[2], t[3]
end
function ReturnFunction(t, n)
return n ~= nil and ReturnOneValue(t, n) or ReturnThreeValues(t)
end
local t = {"One", "Two", "Three"}
local r1, r2, r3 = ReturnFunction(t)
print(r1, r2, r3)
</script>Run Code Online (Sandbox Code Playgroud)
好吧,基本上我不明白为什么我的打印结果是:“一零零”而不是:“一二三”,因为它应该是,如果三元运算符按(我认为是)预期的方式工作......或者在以这种三元方式解决多重返回函数时,我是否没有考虑到什么?
编辑:
FTR(以防万一对任何人都有用),在做了更多研究后,我找到了另一个问题以及可能的解决方法,结果证明它有效,如下所示:
<script src="//github.com/fengari-lua/fengari-web/releases/download/v0.1.4/fengari-web.js"></script>
<script type="application/lua">
function ReturnOneValue(t, …Run Code Online (Sandbox Code Playgroud)此代码将无法编译:
var x = new {
Property = null,
};
Run Code Online (Sandbox Code Playgroud)
但以下例外:无法将 null 分配给匿名类型属性
但这会工作得很好:
var someBool = false;
var x = new {
Property = someBool ? "value" : null,
};
Run Code Online (Sandbox Code Playgroud)
我认为存在像这样的隐式转换 - (string)null 但不完全确定。
所以我想更多地了解这个案例以及它的内部工作原理(我没有找到任何文章解释这一点)
为什么我的SupposedId下面的类型不是类型标识?
Typescript 正在抱怨Type 'T' is not assignable to type 'SupposedId<T>'.
为什么T不能分配给 或T,T我错过了什么?
type SupposedId<T> = T extends object ? T : T;
function makeId<T>(test: T): SupposedId<T> {
return test // <- Type 'T' is not assignable to type 'SupposedId<T>'
}
Run Code Online (Sandbox Code Playgroud)
char g = 'G';
int i = 0;
System.out.print(1 == 1 ? g : 0);
System.out.print(" ");
System.out.print(1 == 0 ? i : g);
Run Code Online (Sandbox Code Playgroud)
理论上,这应该打印出“GG”,因为它两次打印字符变量的值。然而,第二次它打印出字符“G”的 ASCII 值。
上面的代码将打印出“G 71”,这不是预期的结果。
char g = 'G';
int i = 0;
System.out.print(1 == 1 ? g : 0);
System.out.print(" ");
System.out.print(1 == 0 ? 0 : g);
Run Code Online (Sandbox Code Playgroud)
然而,第二位代码将打印出“G G”,这是预期的。