标签: safe-navigation-operator

javascript中是否存在null-coalescing(Elvis)运算符或安全导航运算符?

我将通过例子解释:

猫王运营商(?:)

"Elvis运算符"是Java三元运算符的缩写.这方面的一个实例是,如果表达式解析为false或null,则返回"合理的默认值".一个简单的例子可能如下所示:

def gender = user.male ? "male" : "female"  //traditional ternary operator usage

def displayName = user.name ?: "Anonymous"  //more compact Elvis operator
Run Code Online (Sandbox Code Playgroud)

安全导航操作员(?.)

安全导航操作符用于避免NullPointerException.通常,在引用对象时,可能需要在访问对象的方法或属性之前验证它是否为null.为了避免这种情况,安全导航操作符将只返回null而不是抛出异常,如下所示:

def user = User.find( "admin" )           //this might be null if 'admin' does not exist
def streetName = user?.address?.street    //streetName will be null if user or user.address is null - no NPE thrown
Run Code Online (Sandbox Code Playgroud)

javascript jquery groovy safe-navigation-operator

185
推荐指数
13
解决办法
8万
查看次数

安全导航操作员(&.)为零

由于Ruby 2.3引入了安全导航操作符(&.),即孤独运算符,nil对象上的行为似乎很奇怪.

nil.nil?    # => true
nil&.nil?   # => nil
Run Code Online (Sandbox Code Playgroud)

这样设计的行为是这样吗?或者在添加孤独运算符时滑落的边缘情况?

ruby safe-navigation-operator ruby-2.3

24
推荐指数
2
解决办法
7259
查看次数

使用Hash #dig或Lonely运算符(&.)安全地为嵌套哈希值赋值

h = {
  data: {
    user: {
      value: "John Doe" 
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

要为嵌套哈希值赋值,我们可以使用

h[:data][:user][:value] = "Bob"
Run Code Online (Sandbox Code Playgroud)

但是,如果缺少中间的任何部分,则会导致错误.

就像是

h.dig(:data, :user, :value) = "Bob"
Run Code Online (Sandbox Code Playgroud)

不起作用,因为还没有Hash#dig=.

为了安全地分配价值,我们可以做到

h.dig(:data, :user)&.[]=(:value, "Bob")    # or equivalently
h.dig(:data, :user)&.store(:value, "Bob")
Run Code Online (Sandbox Code Playgroud)

但有更好的方法吗?

ruby hash dig safe-navigation-operator ruby-2.3

17
推荐指数
2
解决办法
3229
查看次数

是否有像安全导航操作员可以在阵列上使用的东西?

我已经使用安全导航操作员对象来加载异步调用,这是非常了不起的.我以为我可以为Arrays重现相同但它在我的Angular代码中显示模板解析错误.我知道*ngIf是一种替代解决方案,但是有一种更简单(通过代码)的方式就像安全导航操作员一样吗?

<div class="mock">
   <h5>{{data?.title}}</h5>  //This works
   <h6>{{data?.body}}</h6>  //This works
   <h6>{{simpleData?[0]}}</h6>  // This is what I tried to implement    
</div>
Run Code Online (Sandbox Code Playgroud)

html typescript safe-navigation-operator angular

10
推荐指数
3
解决办法
2344
查看次数

为什么Ruby使用自己的语法来安全导航操作符?

Ruby 2.3.0引入了安全的导航语法,通过引入一个仅在前一个语句的值不为nil时调用该方法的新运算符,简化了链式方法调用的零处理.这是一个已经存在的功能,例如在C#,Groovy和Swift中.例如在Groovy中,语法是

foo?.bar
Run Code Online (Sandbox Code Playgroud)

这基本上意味着结果值是foo.bar的结果值,除非foonull,在这种情况下返回值也为null,因此不会抛出异常.此外,C#(称为空条件运算符)和Swift(称为可选链接表达式)使用此表示法.

所以语法似乎在其他语言中非常标准.现在,为什么在Ruby中使用语法

foo&.bar
Run Code Online (Sandbox Code Playgroud)

代替?

ruby syntax language-design safe-navigation-operator

8
推荐指数
1
解决办法
752
查看次数

为什么空条件运算符会更改常规属性访问?

我很困惑null条件运算符如何与普通属性访问级联.拿这两个例子:

a?.b.c
(a?.b).c
Run Code Online (Sandbox Code Playgroud)

我希望它们是等价的:首先,a?.b评估值,然后result.c进行评估.因此,如果a == null应该抛出异常.

但是,这只发生在第二个表达式中.第一个表达式求值为null,意思是它相同a?.b?.c.为什么?

c# null-conditional-operator safe-navigation-operator

4
推荐指数
1
解决办法
98
查看次数

无需每次都使用安全导航操作符和异步管道即可访问模板中的 Observable

我是 Angular 的新手,在 rxjs 和所有异步的事情上遇到了一些困难。

一些背景

假设您有一个像 facebook 这样的带有个人资料的网站。您可以通过导航至 来访问个人资料website.com/profiles/profileUrl。同样,当单击个人资料时,您会转到profiles/:profileUrlAngular 术语的路由。

这是如何实施的?

我路由到PersonProfileComponent并从后端检索配置文件数据,两者都基于profileUrl

成分

export class PersonProfileComponent implements OnInit {
  person: Observable<PersonTO>;

  constructor(private route: ActivatedRoute,
  private mockDataService: MockPersonService) {}

  ngOnInit() {
     this.route.params.subscribe(params => {
        this.initializePerson(params['profileUrl']);
     });
  }

  initializePerson(profileUrl: string) {
     this.mockDataService.getFullPersonByProfilUrl(profileUrl).
     subscribe(foundPerson => {
         this.person = of(foundPerson);
     });
  }
}
Run Code Online (Sandbox Code Playgroud)

模板

<p>
   profile works {{(person | async)?.profileUrl}}!
</p>
Run Code Online (Sandbox Code Playgroud)

问题

虽然一切正常,但我确实不喜欢模板“ (person | async)?.profileUrl”中的这部分。person 对象可以变得非常大,具有许多属性,我无法想象像这样访问每个属性。就是感觉不太对劲。在仍然使用异步管道的同时,有没有办法解决这个问题,因为它可以为我处理所有订阅和取消订阅?此外,我感谢有关此片段以及如何更好地实施它的任何批评!

asynchronous observable rxjs safe-navigation-operator angular

4
推荐指数
1
解决办法
1035
查看次数

当接收器为零时,Ruby 安全导航运营商是否评估其参数?

题:

Ruby 安全导航操作符 ( &.) 是否在其接收器为 时评估其参数nil

例如:

logger&.log("Something important happened...")
Run Code Online (Sandbox Code Playgroud)
  • "Something important happened..."字符串是在这里求值的吗?
  • 您能否提供一个权威来源,证明或否认这一事实?
  • 或者建议一种如何检查它的方法?

提前致谢。




为什么我要寻找这个问题的答案?

我的代码库中有如下代码:

logger&.log("Something important happened...")
Run Code Online (Sandbox Code Playgroud)

我的主要目标是if verbose在我调用该log方法时消除重复检查,因为很容易忘记它,并且您根本不会收到有关误用的通知。

Tell启发,不问原则,

我已经if verboselog方法实现中移动了检查。

logger.log("Something important happened. (#{Time.current})") if verbose
Run Code Online (Sandbox Code Playgroud)

这种方法简化了我的代码,因为我已经解决了我的主要问题 -if verbose每次调用该log方法时我都不需要记住放置,

但我收到了另一个问题。

"Something important..."字符串总是被评估,无论verbosetrue还是false

因此,我彻底改变了解决方案:

  • logger返回nilverbosefalse
  • Ruby 安全导航操作符应该在log调用前使用。
class …
Run Code Online (Sandbox Code Playgroud)

ruby safe-navigation-operator

4
推荐指数
1
解决办法
216
查看次数

Ruby:安全导航操作符,未定义方法`call`

我试图比较一个数字文字与可以返回的函数的返回值nil或数字.考虑一下:

def unreliable
  [nil, 42].sample  
end

unreliable > 10
Run Code Online (Sandbox Code Playgroud)

这将占50%的时间NoMethodError: undefined method '>' for nil:NilClass.所以我尝试了这个:

unreliable&.(:>, 10)
Run Code Online (Sandbox Code Playgroud)

这种方法可以保证nil我的预期,但是在unreliable返回时我得到了这个42:

NoMethodError: undefined method `call' for 42:Fixnum
Run Code Online (Sandbox Code Playgroud)

我怀疑这与允许每个只存在一个实例的怪癖有关Numeric,请参见此处.而且我知道我可以这样做:

foo = unreliable
foo && foo > 10
Run Code Online (Sandbox Code Playgroud)

但有使用安全导航运营商,数字和方式:>,:<,:==,:+,:-,:/,:*,等?


编辑:Numeric在我的问题中,重点是红鲱鱼.请参阅@Jörg的回答.我把Rails的try语法与安全导航操作符的语法混淆了.

ruby safe-navigation-operator

3
推荐指数
1
解决办法
883
查看次数

带有字符串键的哈希的安全导航操作符

我有个问题:

data = { 'str_key' => ['string1', 'string2'] }

# @param [Hash] data - hash with String key
# @return [boolean]
def some_logic_test?(data)
  data&.<what_to_do_with_string_key?>.include?('string1')
end
Run Code Online (Sandbox Code Playgroud)

如何将安全导航运算符&.用于带有字符串键的哈希?[原文如此] 必须转换密钥吗?

ruby hash safe-navigation-operator

3
推荐指数
1
解决办法
1713
查看次数

带有括号属性访问器的安全导航操作符

我遇到过无法使用点表示法访问属性的情况,因为属性的名称包含点。

我有一个名为 的对象translations,其属性包含字符串翻译,例如该Tooltip.O2属性包含图像工具提示的翻译:

<img [matTooltip]="translations?.Tooltip.O2" [src]="bed.additionalO2 ? medO2 : noO2">
Run Code Online (Sandbox Code Playgroud)

当我这样做时,它认为我正在尝试访问带有属性的Tooltip内部对象。我知道我可以使用括号表示法来访问它:translationsO2

[matTooltip]="translations['Tooltip.O2']"
Run Code Online (Sandbox Code Playgroud)

但是,安全导航运算符似乎不能?与括号表示法一起使用。我试图写translations?['Tooltip.O2'],但它导致了错误。

我想知道是否有一种方法可以使用点表示法访问该属性,或者是否有一种方法可以使用带有括号表示法的安全导航运算符?

properties safe-navigation-operator angular

1
推荐指数
1
解决办法
2241
查看次数