Ruby:方法参数中()和[]之间的差异

时间:2016-08-03 19:33:21

标签: ruby rspec

我正在使用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如何理解方括号的方法。

感谢

3 个答案:

答案 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']

方括号不是可选的。

相关问题