我正在使用rspec测试散列是否包含密钥。
private void setUpMediaSession(final MediaInfo info) {
if (!isFeatureEnabled(CastConfiguration.FEATURE_LOCKSCREEN)) {
return;
}
if (mMediaSessionCompat == null) {
ComponentName mediaEventReceiver = new ComponentName(mContext,
VideoIntentReceiver.class.getName());
mMediaSessionCompat = new MediaSessionCompat(mContext, "TAG", mediaEventReceiver,
null);
mMediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
| MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mMediaSessionCompat.setActive(true);
mMediaSessionCompat.setCallback(new MediaSessionCompat.Callback() {
@Override
public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
KeyEvent keyEvent = mediaButtonIntent
.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (keyEvent != null && (keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PAUSE
|| keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PLAY)) {
toggle();
}
return true;
}
@Override
public void onPlay() {
toggle();
}
@Override
public void onPause() {
toggle();
}
private void toggle() {
try {
togglePlayback();
} catch (CastException | TransientNetworkDisconnectionException |
NoConnectionException e) {
LOGE(TAG, "MediaSessionCompat.Callback(): Failed to toggle playback", e);
}
}
});
}
mAudioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
PendingIntent pi = getCastControllerPendingIntent();
if (pi != null) {
mMediaSessionCompat.setSessionActivity(pi);
}
if (info == null) {
mMediaSessionCompat.setPlaybackState(new PlaybackStateCompat.Builder()
.setState(PlaybackStateCompat.STATE_NONE, 0, 1.0f).build());
} else {
mMediaSessionCompat.setPlaybackState(new PlaybackStateCompat.Builder()
.setState(PlaybackStateCompat.STATE_PLAYING, 0, 1.0f)
.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE).build());
}
// Update the media session's image
updateLockScreenImage(info);
// update the media session's metadata
updateMediaSessionMetadata();
mMediaRouter.setMediaSessionCompat(mMediaSessionCompat);
}
但是由于错误,我从正常的括号变为方括号:
response_data = JSON.parse(response.body)['data']
expect(response_data).to have_key('store_id')
expect(response_data).to have_key('store_name')
我花了很长时间调试错误:
NoMethodError:未定义的方法`[]'
我的问题是:Ruby没有抛出关于这个语法的异常是错误的,但关于response_data = JSON.parse(response.body)['data']
expect(response_data).to have_key['store_id']
expect(response_data).to have_key['store_name']
的异常所以我很好奇ruby如何理解方括号的方法。
感谢
答案 0 :(得分:3)
当您在ruby中调用方法时,使用()
。有时您可以在特定对象上使用[]
并且它可以正常工作,但这只是因为此对象的类型在其定义中定义了[]
方法。例如
class Foo
def [](key)
key
end
end
# and later you can call:
foo = Foo.new
foo['anything']
答案 1 :(得分:2)
它的语法糖。 []
和[]=
是为Array,Hash和其他类定义的方法。
给定a
数组,我认为
a[0] = 5
与
相同a.[]=(0, 5)
我在irb中尝试过,它有效:)
答案 2 :(得分:0)
通常,圆括号用于指定参数,方括号用于索引事物。
示例:
def is_a_method(a, b)
end
is_a_method(1,2)
is_a_hash = { a: 1, b: 2 }
is_a_hash[:a]
他们不可互换。就像编程中的很多东西一样,确切的字符很重要。
这些东西可以堆叠和组合:
JSON.parse(response.body)['data']
在这种情况下,JSON.parse(...)
方法调用的结果是哈希数据结构。调用['data']
就会从该结构中拉出一个元素。
在许多情况下,圆括号是可选的,但在某些情况下,为了清晰起见,最好将它们包括在内。例如,你可以表达如下:
body = JSON.parse response.body
body['data']
方括号不是可选的。