我将通过例子解释:
猫王运营商(?:)
"Elvis运算符"是Java三元运算符的缩写.这方面的一个实例是,如果表达式解析为false或null,则返回"合理的默认值".一个简单的例子可能如下所示:
def gender = user.male ? "male" : "female"  //traditional ternary operator usage
def displayName = user.name ?: "Anonymous"  //more compact Elvis operator
安全导航操作员(?.)
安全导航操作符用于避免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
由于Ruby 2.3引入了安全导航操作符(&.),即孤独运算符,nil对象上的行为似乎很奇怪.
nil.nil?    # => true
nil&.nil?   # => nil
这样设计的行为是这样吗?或者在添加孤独运算符时滑落的边缘情况?
h = {
  data: {
    user: {
      value: "John Doe" 
    }
  }
}
要为嵌套哈希值赋值,我们可以使用
h[:data][:user][:value] = "Bob"
但是,如果缺少中间的任何部分,则会导致错误.
就像是
h.dig(:data, :user, :value) = "Bob"
不起作用,因为还没有Hash#dig=.
为了安全地分配价值,我们可以做到
h.dig(:data, :user)&.[]=(:value, "Bob")    # or equivalently
h.dig(:data, :user)&.store(:value, "Bob")
但有更好的方法吗?
我已经使用安全导航操作员对象来加载异步调用,这是非常了不起的.我以为我可以为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>
Ruby 2.3.0引入了安全的导航语法,通过引入一个仅在前一个语句的值不为nil时调用该方法的新运算符,简化了链式方法调用的零处理.这是一个已经存在的功能,例如在C#,Groovy和Swift中.例如在Groovy中,语法是
foo?.bar
这基本上意味着结果值是foo.bar的结果值,除非foo为null,在这种情况下返回值也为null,因此不会抛出异常.此外,C#(称为空条件运算符)和Swift(称为可选链接表达式)使用此表示法.
所以语法似乎在其他语言中非常标准.现在,为什么在Ruby中使用语法
foo&.bar
代替?
我很困惑null条件运算符如何与普通属性访问级联.拿这两个例子:
a?.b.c
(a?.b).c
我希望它们是等价的:首先,a?.b评估值,然后result.c进行评估.因此,如果a == null应该抛出异常.
但是,这只发生在第二个表达式中.第一个表达式求值为null,意思是它相同a?.b?.c.为什么?
我是 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);
     });
  }
}
模板:
<p>
   profile works {{(person | async)?.profileUrl}}!
</p>
虽然一切正常,但我确实不喜欢模板“ (person | async)?.profileUrl”中的这部分。person 对象可以变得非常大,具有许多属性,我无法想象像这样访问每个属性。就是感觉不太对劲。在仍然使用异步管道的同时,有没有办法解决这个问题,因为它可以为我处理所有订阅和取消订阅?此外,我感谢有关此片段以及如何更好地实施它的任何批评!
asynchronous observable rxjs safe-navigation-operator angular
Ruby 安全导航操作符 ( &.) 是否在其接收器为 时评估其参数nil?
例如:
logger&.log("Something important happened...")
"Something important happened..."字符串是在这里求值的吗?提前致谢。
我的代码库中有如下代码:
logger&.log("Something important happened...")
我的主要目标是if verbose在我调用该log方法时消除重复检查,因为很容易忘记它,并且您根本不会收到有关误用的通知。
我已经if verbose在log方法实现中移动了检查。
logger.log("Something important happened. (#{Time.current})") if verbose
这种方法简化了我的代码,因为我已经解决了我的主要问题 -if verbose每次调用该log方法时我都不需要记住放置,
但我收到了另一个问题。
"Something important..."字符串总是被评估,无论verbose是true还是false。
因此,我彻底改变了解决方案:
logger返回nil时verbose是false。log调用前使用。class …我试图比较一个数字文字与可以返回的函数的返回值nil或数字.考虑一下:
def unreliable
  [nil, 42].sample  
end
unreliable > 10
这将占50%的时间NoMethodError: undefined method '>' for nil:NilClass.所以我尝试了这个:
unreliable&.(:>, 10)
这种方法可以保证nil我的预期,但是在unreliable返回时我得到了这个42:
NoMethodError: undefined method `call' for 42:Fixnum
我怀疑这与允许每个只存在一个实例的怪癖有关Numeric,请参见此处.而且我知道我可以这样做:
foo = unreliable
foo && foo > 10
但有使用安全导航运营商,数字和方式:>,:<,:==,:+,:-,:/,:*,等?
编辑:Numeric在我的问题中,重点是红鲱鱼.请参阅@Jörg的回答.我把Rails的try语法与安全导航操作符的语法混淆了.
我有个问题:
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
如何将安全导航运算符&.用于带有字符串键的哈希?[原文如此] 必须转换密钥吗?
我遇到过无法使用点表示法访问属性的情况,因为属性的名称包含点。
我有一个名为 的对象translations,其属性包含字符串翻译,例如该Tooltip.O2属性包含图像工具提示的翻译:
<img [matTooltip]="translations?.Tooltip.O2" [src]="bed.additionalO2 ? medO2 : noO2">
当我这样做时,它认为我正在尝试访问带有属性的Tooltip内部对象。我知道我可以使用括号表示法来访问它:translationsO2
[matTooltip]="translations['Tooltip.O2']"
但是,安全导航运算符似乎不能?与括号表示法一起使用。我试图写translations?['Tooltip.O2'],但它导致了错误。
我想知道是否有一种方法可以使用点表示法访问该属性,或者是否有一种方法可以使用带有括号表示法的安全导航运算符?
ruby ×6
angular ×3
hash ×2
ruby-2.3 ×2
asynchronous ×1
c# ×1
dig ×1
groovy ×1
html ×1
javascript ×1
jquery ×1
observable ×1
properties ×1
rxjs ×1
syntax ×1
typescript ×1