在Crystal中,为什么需要进行matchs.try&。[0]

时间:2018-11-20 01:37:15

标签: crystal-lang

以下是一些代码:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);
    spinner_bluetooth_list = findViewById(R.id.spinner);
    txt_password = findViewById(R.id.txt_password);
    txt_mac_address = findViewById(R.id.txt_mac_address);
    spinnerArrayAdapter = new ArrayAdapter(SettingsActivity.this, android.R.layout.simple_list_item_1);
    spinner_bluetooth_list.setAdapter(spinnerArrayAdapter);
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    registerReceiver(mReceiver, filter);


}
根据{{​​1}},

matches = /\/([a-z]+)\/(\d+)\/state\/([a-z]+)/.match(address) # line 1 puts matches[0]? # line 2 puts matches.try &.[0] # line 3 数据类型为matches。但是,引用(Regex::MatchData | Nil)的第2行因编译错误而失败。而且我根本听不懂第三行!

有人可以澄清吗?

1 个答案:

答案 0 :(得分:4)

第2行:您所说的matches的类型为(Regex::MatchData | Nil)。万一碰巧是nil,它就没有#[]?方法,这会使类型检查器发怒。您应该先检查match是否成功:

matches =  /\/([a-z]+)\/(\d+)\/state\/([a-z]+)/.match(address)
if matches
  puts matches[0]?
end

if内部,matches的类型仅为Regex::MatchData(因为我们消除了Nil的可能性),并且类型检查器可以安静地休息。

如果您确定您的字符串将匹配,则可以使用not_nil!来缓和类型检查器,但是如果您对数据一致性的信心没有根据,则可能会出现运行时错误:

puts matches.not_nil![0]?

第3行:#try将执行该块,除非调用者为nil时返回nil。不需要保护措施,因为#try已在Nil(以及Object)上明确定义。

它将shortcut syntax用于块,其中&.[0]相当于{ |x| x[0] }