以下是一些代码:
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行因编译错误而失败。而且我根本听不懂第三行!
有人可以澄清吗?
答案 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] }
。